Что такое код asp logfilelocaltimerollover

Содержание

7. Проверка ввода пользователя

Элементы управления для проверки ввода пользователя (validation controls) в ASP.NET 2.0, CompareValidator, CustomValidator, RangeValidator, RegularExpressionValidator, RequiredFieldValidator, ValidationSummary

В реальных Web-приложениях без проверки ввода пользователя не обойтись. Пользователь может не заполнить какие-то требуемые поля, ввести в них явно неверные или, возможно, сознательно вредоносные значения, использовать неверный формат и т.п. Чтобы подобная информация не попала на сервер и не вызвала проблем при обработке, вводимую пользователем информацию рекомендуется проверять.

В ASP.NET проверка всегда производится на сервере плюс в добавление к серверной проверке можно реализовать проверку и на клиенте. Только на клиенте реализовать проверку нельзя: по соображениям безопасности она всегда дублируется на сервере.

Стандартные проверки: на количество символов, цифры или буквы, диапазон значений, соответствие формуле, соответствие маске для строкового значения и т.п.

Если проверка вернула ошибку, то обычно выводится сообщение и обработка страницы прекращается до тех пор, пока пользователь не исправит значение.

Проверки — это еще и защита Web -приложения от хакеров. Стандартно используются две атаки:

· spoofing — хакер генерирует специальный код и посылает его серверу, сообщая, что он «прошел» проверку на клиенте. ASP . NET за счет обязательного дублирования проверок такой класс атак отметает радикально.

· если пользователь может вводить текст неограниченной длины в поля Web-формы, то можно нарваться на переполнение буфера, атаку DDOS или прочие вещи. Проверки и ограничения позволяют решить эту проблему.

Клиентские проверки в ASP.NET реализуются средствами DHTML и JScript . Серверные проверки могут быть реализованы на любом .NET-совместимом языке. Работу с проверками очень упрощает то, что для проверок заранее заготовлены специальные элементы управления — val >s .

Клиентские проверки (в IE4.0 и более поздних версиях) срабатывают, когда пользователь нажимает на кнопку Submit и работают до отправки данных на Web-сервер. Если проверка не пройдена, данные и не будут посланы на Web-сервер.

В IE5.0 и более поздних, в которых поддерживается DHTML, проверки также могут срабатывать для конкретного элемента управления, когда он теряет фокус.

Учитывая различия в версиях и возможностях броузеров, обычно реализация проверок, которые нормально бы работали на броузерах разных версий — достаточно тяжелая и трудоемкая задача. Использование элементов управления .NET, которые автоматом определяют версию броузера и генерируют нужный код, позволяет эту работу во многом упростить.

Серверные проверки выполняются на сервере. Они могут быть реализованы на любом . NET -совместимом языке и по своему характеру более функциональны, чем клиентские (например, можно сравнивать ввод пользователя с данными, хранящимися на сервере). Для любой клиентской проверки в ASP.NET автоматически создается дублирующий ее серверный код проверки.

Какие элементы управления ASP.NET позволяют реализовать проверки клиентского ввода:

· Compare V alidator — ввод пользователя сравнивается со значением в другом элементе управления, фиксированным значением, со значением из файла или проверяется на соответствие типу данных. Используется очень часто (например, для проверки правильности ввода пароля в двух полях);

· CustomValidator — можно реализовать свой собственный код проверки (например, проверяем, правильно ли указан номер телефона и т.п.)

· RangeValidator — проверка, попадает ли введенное пользователем значение в указанный диапазон (например, проверка возраста)

· RegularExpressionValidator — проверка по шаблону (на соответствие подстановочным символам). Проверяем адреса e-mail, почтовые индексы, ИНН, телефонные номера и т.п. Наиболее часто используемые шаблоны уже реализованы в .NET

· RequiredFieldValidator — просто проверяется, введено пользователем значение в это поле или нет;

· ValidationSummary — предназначено для вывода информации о всех ошибках проверки (чтобы пользователь знал, что ему исправлять). Обычно помещается недалеко от кнопки Submit.

Теперь — непосредственно о работе с этими элементами управления.

Принцип работы с validation controls достаточно простой:

1) при помощи T oolbox помещаем на форму нужный validation control;

2) настраиваем его свойство ControlToValidate, определяя тем самым, значение какого элемента управления будет проверяться. Одному обычному элементу управления можно назначить много validation controls. Пока все они не вернут True, будет генерироваться ошибка проверки.

3) настраиваем прочие свойства validation control — выражение для проверки, текст сообщения об ошибке и т.п.

Свойства у разных элементов управления validation разные, но у каждого из них (кроме validation summary) есть два общих свойства:

· Type — проверяемый тип данных

· EnableClientScript — нужно ли реализовывать данную проверку на клиенте (по умолчанию нужно). Клиентские проверки всегда будут созданы на JScript.

Validation controls нужно размещать не в любом месте формы, а в правильном, поскольку при возникновении ошибки на месте vc выводится сообщение. Желательно, конечно, располагать его рядом с проверяемым ЭУ.

По умолчанию то сообщение, которое будет выводиться на месте VC и передаваться ValidationSummary , определяется свойством ErrorMessage . Однако текст сообщения, которое будет выводиться на месте VC, можно переопределить при помощи свойства Text. ValidationSumary всегда передается значение ErrorMessage. Если вы используете в форме ValidationSummary, то ЭУ, значение в котором вызвало ошибку, будет помечен красной звездочкой.

То, как будет выглядеть сообщение об ошибке на месте VC, определяется его свойством Display. Это свойство может принимать три значения:

· Static (по умолчанию) — место под этот элемент управления всегда будет зарезервировано на странице;

· Dynamic — этот элемент управления будет рендериться, как все остальные, и если сообщения нет, его место будет занято другими компонентами формы

· None — вывод сообщения на месте VC будет вообще подавлен.

Иногда приходится к одному обычному ЭУ привязывать сразу несколько проверяющих. Например, у нас есть поле для ввода телефона. Нам может потребоваться проверять его сразу тремя проверяющими элементами:

· RequiredFieldValidator — чтобы пользователь не забыл его заполнить;

· RegularExpressionField — на соответствие маске;

· CustomValidator — есть ли уже такой номер в нашей базе.

Некоторые особенности работы с проверяющими элементами управления.

Для самого простого элемента управления RequiredFieldVal >InitialValue . Это — то значение, с которым не должно совпасть проверяемое поле. По умолчанию оно пусто, и, значит, пользователь не может оставить значение в проверяемом поле пустым. Если у вас для проверяемого поля используется значение по умолчанию, то значение RequiredFieldValidator желательно поменять на такое же значение.

Проверять на пустое значение можно только при помощи RequiredFieldValidator. Если вам нужно проверять на пустое значение и на что-то еще, используется RequiredFieldValidator и дополнительный проверяющий элемент управления.

Для CompareValidator используются следующие свойства:

· ValueToCompare — проверка на соответствие константным значениям. Можно указывать несколько константных значений (их нужно будет разделять вертикальной чертой — |).

· ControlToCompare — проверка на соответствие значению из другого элемента управления. Обычно для сравнения двух значений паролей.

· Type — проверка на соответствие типу данных.

· Operators — здесь придется указывать имя операторов сравнения: Equal , NotEqual , GreaterThen , GreaterThanEqual и т.п.

Для RangeVal >MinimumValue , MaximumValue и Type .

Особенности работы с RegularExpressionValidator : главное свойство — ValidationExpression . При нажатии на него появляется большое список готовых шаблонов. Можно использовать и свой шаблон (Custom). Список подстановочных символов, которые можно использовать, очень большой.

CustomValidator — самый мощный и самый сложный проверяющий элемент управления. Можно проверять на соответствие формуле, значению из источника данных, значению, возвращаемому COM-компонентом или Web-службой. Используется в сложных ситуациях, например, для проверки паролей, база которых хранится на сервере.

В отличие от других элементов управления, CustomValidator не генерирует серверные и клиентские скрипты за вас — это придется сделать вам. Два главных свойства CustomValidator:

· ClientValidationFunction — клиентский проверяющий скрипт;

· OnServerValidate — серверный скрипт.

Конечно, логическое соответствие клиентского и серверного скрипта вам придется обеспечивать и проверять самостоятельно.

Серверная функция для CustomVal >

Клиентскую процедуру надо писать на JScript вручную на странице HTML (не Codebehind ), сразу после тега Head, например так:

function MyClientValidation(source, arguments)

alert(«I am running on the client! «);

var intValue = arguments.Value;

if (intValue % 2 == 0)

Затем в свойствах CustomValidator для свойства ClientValidationFunction указать имя этой функции , а для свойства EnableClientScript установить значение True. Желательно также определиться с версией броузера, в которой будет выполняться этот скрипт. Для этого нужно открыть свойства страницы (из контекстного меню в дизайнере, щелкнув правой кнопкой по пустому месту в странице) и для свойства Target Schema выбрать нужный броузер, например, I nternet Explo rer 5.0.

Теперь — о ValidationSummary и Page . IsValid .

Обычно, прежде чем продолжать обработку страницы, необходимо убедиться, что все проверяющие элементы управления дали на это «добро». Для проверки всех серверных элементов управления используется свойство Page.IsVal >ValidationSummary .

Свойство IsValid для страницы объединяет через логическое И все проверяющие ЭУ на странице. Если хотя бы один такой элемент вернул false, то IsValid возвращает false.

Информация проверки недоступна во время инициализации и загрузки страницы — только после.

Пример кода для кнопки, в котором проверяется свойство isValid:

Sub cmdSubmit_Click (s As Object, e As EventArgs)

If Page.IsValid Then

Message.Text = «Page is valid!»

’ Perform database updates or other logic here

Если на странице был создан элемент управления ValidationSummary , то он отработает на сервере автоматически, если Is V al >ValidationSummary :

· HeaderText — заголовок списка;

· DisplayMode — отражать сообщения маркированным списком или просто абзацем

· ShowSummary — выводить ли список на странице (по умолчанию true).

· ShowMessageBox — выводить ли список в окне сообщения (по умолчанию false).

Обращение к элементу по его >14.12.2010, 23:53. Просмотров 5829. Ответов 10

14.12.2010, 23:53

Обращение к элементу списка по его номеру
Добрый вечер! Подскажите, пожалуйста, как обратиться к элементу списка с определённым номером.

Обращение к элементу в List, зная его индекс
Здравствуйте, у меня возникла проблема создан список public List

Что быстрее? Обращение к элементу массива или к элементу структуры?
Обращение к элементу массива или к элементу структуры? Экспериментирую с кодом и получается.

Обращение к элементу
В очень короткие сроки надо сделать работу, поэтому просто нет времени разбираться в элементарных.

Обращение к элементу по ID
Здравствуйте, не пинайте сильно только начинаю изучать javascript, раньше программировал на Delphi.

14.12.2010, 23:57 2 14.12.2010, 23:58 [ТС] 3 12.12.2012, 14:50 4
12.12.2012, 14:50
12.12.2012, 15:26 5

привидение типов, и где искать этот контрол не хватает.

12.12.2012, 16:24 6

Спасибо, но не работает. Если я правильно понял в ((TextBox)this.Page.FindControl(«box» + Convert.ToString(num — 1))).Text;
(TextBox) — тип контрола ID которого («box» + Convert.ToString(num — 1)) и this.Page — место где ищем.
Искать нужно в Experience потому что код страницы :

12.12.2012, 17:04 7
17.12.2012, 11:48 8

На всякий случай опишу смысл примера. Есть страничка с текст боксом, пользователь может нажав на кнопку увеличить число текстбоксов, но то что он написал в них до этого не должно пропадать. Проблема в том что при нажатии на кнопку все текстбоксы кроме первого перерисовываются, и по этому пропадают значения в них.Для этого я и хочу каждый раз когда нажимается кнопка считывать данные с уже заполненных текстбокосов, чтобы потом рисовать текстбоксы с данными.

Подведя итог, мне нужен способ узнать значение текстбокса, который был программно создан на странице. а не тот который статично на ней находиться. Кстати, если посмотреть на код страницы в браузере до того как я пытаюсь считать значения с текст бокса он там есть:

17.12.2012, 12:45 9
обсуждалось на форуме сотни раз. поиск рулит.
Комментарий модератора
Правила п.3.3
18.12.2012, 08:05 10
18.12.2012, 22:42 11

Потому что у вас срабатывает PostBack который заставляет заново рисовать страницу, в которой разумеется уже не будет ваших созданных кнопочек. Не нужно снова ничего рисовать — нужно в Page_Load смотреть режим обращения к странице (PostBack или нет) и не рисовать ничего снова и не затирать места где «рисуются» кнопки. Тогда все старые действия сохранятся.
При нажатии на кнопку нужно сделать так чтобы это не вызывало лавину событий в которых вы (как вы признались выше) ещё не сильно хорошо понимаете. Сделайте создание текстбоксов на JavaScripts. Тогда ваша страничка останется жива до того момента, когда вы решите нажать «красную кнопку» и прочитать/сохранить/обработать все эти значения.
Чтобы снова рисовать — нужно что-то читать по этим данным. Или из запроса придут все данные по тексбоксам (читать через Page.Form[«box0») или же создавать какие-то хранилища (типа сессий, вьюстейтов, баз данных и т.п.) Но это больше изврат.
FindControl в случае полной перерисовки страницы уже не найдёт ничего, даже если вы будете знать полное название своего текстбокса. Потому что ваших текстбоксов не будет существовать.

Все задачи «не выглядят тривиальными», просто потому что изменены условия задачи. Но в в целом все одно и тоже и методы решения одни и те же. Просто нужно применить знания в вашу ситуацию (которая с вашей стороны удобнее и понятнее смотрится, чем со стороны читателей).

Добавлено через 4 минуты

18.12.2012, 22:42
18.12.2012, 22:42

Обращение к элементу
Доброго времени суток ! Имеется код: foreach (var pb in Controls.OfType

Обращение к элементу по id
Есть одна страница. На ней есть слой с постоянно меняющимся id. Как обратиться к этому слою? id.

Обращение к элементу
Подскажите, как в Маткаде обратиться к конкретному элементу столбца. То есть есть столбец.

LogFileLocaltimeRollover

The LogFileLocaltimeRollover property specifies IIS log file rollover behavior for W3C Extended logging. If the property is set to false, the default rollover behavior will be in effect, meaning a new log file will be created based on Coordinated Universal Time (UTC), not local time. If this property is set to true, a new log file will be created based on local time, not UTC. UTC was formerly called Greenwich Mean Time, or GMT.

Regardless of the setting, the time stamp for each W3C Extended Logging log record is UTC-based.

Что такое Web API?

Web API – новая исполяющая среда веб-приложения, построенная на уроках и паттернах, одобренных в ASP.NET MVC. Используя простую парадигму контроллеров, Web API позволяет разработчику создавать простые Web API веб-службы с небольшим по объему кодом и конфигурацией.

Вы можете задать очень разумный вопрос: почему нам нужен новый фреймворк веб-служб? Не входит ли уже в стек разработки компании Microsoft популярная и широко совместимая технология Simple Object Access Protocol (SOAP) (простой протокол доступа к объектам)? И не существовали ли ASMX веб-службы с тех самых пор, как был выпущен ASP.NET? И не поддерживает ли уже Windows Communication Foundation (WCF) самую гибкую и расширяемую архитектуру веб-служб? Веб-службы являются повсеместными, и разработчики понимают их. Почему Web API?

Почему Web API?

Для того чтобы ответить на этот вопрос, вам необходимо рассмотреть ряд представлений, связанных с установленной проблемой, и фреймворки, которые существуют для обращения к этой проблеме. Если любое из этих доверительных утверждений отзывается в вас, то продолжайте читать данную главу. Если вы обнаружите, что вы не разделяете эти утверждения, то вашим нуждам вполне будут удовлетворять существующие фреймворки веб-служб.

  • Я верю в то, что существует лучший способ создания веб-служб.
  • Я верю, что веб-службы могут быть простыми и что WCF слишком сложен.
  • Я верю, что в будущем мне нужно будет поддерживать больше HTTP клиентов.
  • Я верю, что основных веб-технологий таких, как GET , POST , PUT и DELETE , достаточно.

Если вы все еще читаете, то мы продолжим обзором того, чем Web API отличается от других фреймворков. Затем мы расширим приложение «Guestbook» таким образом, чтобы поддерживались HTTP веб-службы для существующих экранных функций, с целью продемонстрировать вам, как просто использовать Web API.

Чем Web API отличается от WCF?

ASMX веб-службы на протяжении многих лет поддерживали SOAP веб-службы поверх HTTP, но они не без труда поддерживали более простые веб-службы, которым не нужно было наличие способности взаимодействовать и, таким образом, для них не нужен был SOAP. WCF занял место ASMX как самый последний и лучший способ создания веб-служб на стеке .NET. WCF службы для конечных точек HTTP похожи на следующий код.

Листинг 24-1: Для WCF служб требуется интерфейс, класс и множество атрибутов

Строка 2: Интерфейс определяет службу

Строка 4: Атрибуты определяют операции

Строка 11: Отдельный класс реализует логику службы

В рамках WCF каждая веб-служба определяется с помощью интерфейса, который определяет соглашение. Каждый метод, отмеченный OperationContract , определяет операцию в SOAP конверте WCF службы. Наконец, класс, который реализует интерфейс службы, реализует код и логику.

Запуская эту службу в Visual Studio, вы можете использовать тестовый клиент WCF для того, чтобы увидеть запрос и отклик операции GetData , как это продемонстрировано на рисунке 24-1.

Рисунок 24-1: Тестовый клиент WCF может помочь вам протестировать SOAP веб-службу с помощью WCF.

В рамках отрасли многие разработчики прилагают усилия для упрощения WCF HTTP веб-служб. Многие говорят о RESTful-стиле (Representational State Transfer – репрезентативная передача состояния), который был введен для того, чтобы обозначать использование простейших HTTP веб-служб без всяких украшательств.

ASP.NET Web API использует понятие обычного MVC контроллера и базируется на нем для того, чтобы создать для разработчика простое и продуктивное событие. Web API оставляет SOAP в истории как средство, которое используют приложения для взаимодействия. На сегодняшний момент, из-за повсеместного использования HTTP, большинство рабочих сред и систем программирования поддерживают основные принципы HTTP веб-коммуникации. В связи с тем, что вопрос совместимости решается другими способами, SOAP может быть отодвинут в сторону возрастающими технологиями наследования, а разработчики могут быстро создавать простые HTTP веб-службы (web APIs) с помощью ASP.NET Web API фреймворка.

Примите во внимание различие между кодом, который используется для создания самых простых SOAP веб-служб в листинге 24-1, и следующим кодом, который реализует те же самые функции.

Листинг 24-2: Web API обладает очень простым стилем программирования с ApiController

Строка 4: Базовый класс разрешает основную функциональность

Строка 7: Простые методы определяют операции

Первое отличие, которое вы должны были заметить, – это то, что количество строк кода в данном примере меньше, поскольку отсутствует необходимость в конкретном классе, а также в интерфейсе. Простое наследование от ApiController разрешает функциональность, необходимую для объявления метода в виде операции.

Возврат значения в рамках Web API схож с использованием WCF, но результат совершенно другой. Вы можете увидеть результат, запуская проект в Visual Studio и тестируя его с помощью веб-браузера. Помните, что одним из основополагающих убеждений, касающихся Web API, является тот факт, что веб-службы могут быть простыми. Перейдите с помощью Internet Explorer по адресу http://localhost:/api/values/43 , содержащий средства разработки (нажмите F12 ). На рисунке 24-2 продемонстрировано, что получится в результате.

Рисунок 24-2: Используются HTTP заголовки вместо SOAP конверта.

Вместо того чтобы возвращать SOAP XML , как это делается в WCF, используется более простой формат, JavaScript Object Notation (JSON). Этот формат силен в передаче единичных значений, а также структур сложных объектов. Поскольку язык JavaScript понимает этот формат, jQuery может принимать этот тип данных для использования в AJAX вызовах.

Теперь, когда вы увидели отличие WCF от Web API, давайте начнем добавлять некоторую интересную функциональность поверх приложения «Guestbook» из главы 2.

asp.net core. Возвращать статус код 401 если требуется авторизация для доступа

Есть у меня такой код:

Хочу сделать так, чтобы при попытке обратиться к методу Current неавторизованному клиенту вместо представления выдавало статус код 401. Сейчас возвращает либо странице по умолчанию, либо код 404, если такой страницы не установлено в настройкай маршрутизации. Нужно чтобы этот код возвращался для всех методов, помеченных [Authorize] .

Код класса Startup :

update

Сделал следующий костыль: добавил контроллер AccountController с методом Login , который всегда возвращает UnauthorizedResult . Должен же быть адекватный способ решить мою проблему.

ASP.Net. Лекция 5. AutoPostBack Привязка к данным. Коллекции. Проверка правильности вводимых данных (исходники)

Свойство AutoPostBack

Программирование в ASP.NET ориентировано на события. События на странице, например, нажатие на кнопку, обрабатываются на сервере. Изменения в тексте поля редактирования, выбора опции в списке, нажатие на флажок или переключатель не вызывают немедленной отправки на сервер. Этого можно добиться, если установить свойство AutoPostBack для этих элементов.

Если AutoPostBack установлен для элемента управления TextBox, то для него будет вызываться событие TextChanged, как только поле потеряет фокус или будет нажата клавиша Enter. Чтобы это свойство работало, браузер должен поддерживать ECMAScript(стандарт JavaScript, принятый Европейской ассоциацией производителей компьютеров).

Источником данных для элементов управления могут служить таблицы данных. Давайте разберем пример, входящий в состав Visual Studio — CarSelectorSample. Дело происходит в электронном магазине автомобилей. Имеются разные марки машин, причем для каждой марки имеются несколько моделей. При выборе марки машины в первом списке во второй список автоматически грузятся соответствующие модели.

Brand Buick Chevrolet Pontiac Toyota Mileage Features
Power seat
Buick Century Impala Grand Am Avalon 0-10000 Leather seat
Chevrolet LeSabre Malibu Grand Prix Camry 10000-20000 Sun roof
Pontiac Park Avenue Metro Montana Camry Solara 20000-30000 CD player
Toyota Regal Prizm Sunfire Celica 30000 and more ABS

Все данные, используемые на этой странице, собраны в таблицу. Для хранения такой таблицы есть класс DataTable. Таблица состоит из столбцов — DataColumn и строк DataRow. Класс DataView позволяет создавать различные представления данных таблицы. Первый столбец служит источником данных списка марок. В зависимости от выбранной модели в список моделей загружается одна из 2-5 колонок.

Вначале создается таблица

Здесь вызывается один из конструкторов DataColumn. Первый аргумент — название колонки, второй — тип.

Создается новая строка таблицы. Ячейка таблицы задается с помощью индекса строки.

И строка добавляется в таблицу.

У выпадающего списка марок установлено свойство AutoPostBack. Это значит, что страница автоматически подается на сервер, когда в этом списка меняется выбранный элемент.

В обработчике выбора нового элемента вначале выясняется, какой элемент выбран.

В операторе switch происходит переключение второго списка на один из столбцов таблицы заданием свойств DataTextField и DataValueField, где DataTextField — текст, отображаемый в списке, а DataValueField — выбранное значение. В данном случае, как часто бывает, они одинаковы.

Привязка к данным

Некоторые элементы управления: списки, таблицы и другие — имеют свойство DataSource, которое отвечает за привязку к данным. Тип этого свойства — object, то есть может быть любого типа, но этот тип должен реализовывать интерфейс IEnumerable. Часто значениями этого свойства назначают коллекции. В таком случае нет нужды добавлять значения вручную. Свойство DataSource может быть привязано к коллекциям, поддерживающим интерфейсы IEnumerable, ICollection или IListSource. Источником данных также могут быть XML-файлы, базы данных. Вызовом метода DataBind данные привязываются к элементу управления. Метод Page.DataBind вызывает привязку данных у всех элементов на странице.

Приведенный ниже выпадающий список помогает выбрать континент для путешествия. Источник данных — динамический массив ArrayList . Используйте его, если в программе происходит много вставок и удалений.

Можно использовать в качестве источника данных хеш-таблицы (Hashtable). Хеш-таблицы — это структуры данных, которые были придуманы давно(см. 3 том «Искусства программирования» Д.Кнута), но программисты долгое время были вынуждены реализовывать их вручную. В языке php обычный массив и есть хэш-таблица. В библиотеке STL для языка С++ тоже есть тип map, в котором данные хранятся таким способом. Хеш-таблицы позволяют очень быстро найти значение по ключу. Индекс в коллекции вычисляется как простая хэш-функция ключа. В C# ключи используются как индексаторы. Используйте Hashtable , если в программе часто осуществляется поиск. Вставка и удаление происходят в нем медленно. Ключи могут быть произвольного типа. В классе Object определен виртуальный метод GetHashCode, он и используется в Hashtable.

Здесь ключом хэш-таблицы является дата. Convert.ToDateTime конвертирует строку в тип даты. VisibleDate гарантирует, что на календаре будет июнь 2006 года. Если значений по ключу в таблице нет, то индексатор просто возвращает null. Значения можно вводить в любом порядке.

Хотелось бы добавить в страницу новую возможность введения новых записей. Можно ввести новые элементы управления — строку ввода и кнопку для подачи данных. При обработке нажатия на кнопку добавим в хэш-таблицу новое значение.

Эта страница не работает. Дело в том, что страница загружается заново, когда меняется дата. Хэш-таблица создается заново, и введенные в нее значения теряются. Как же решить эту проблему? Сделаем хэш-таблицу статической переменной.

Классы проверки данных (Валидаторы)

Данные из форм обычно записываются в базы данных, и тип информации в них должен соответствовать типу и длине данных в полях таблиц баз данных. Кроме того, иногда нужно вводить взаимосвязанные данные, например пароль во время регистрации нужно вводить 2 раза, и он в обоих полях должен совпадать. Некоторые хакеры пытаются вводить в формы программные коды, чтобы взломать вашу систему. Бдительность и еще раз бдительность, как говорил товарищ. не помню кто. А если пользователь ввел неверные данные случайно, сервер выдаст непонятное сообщение об ошибке, и ценный клиент уйдет с нашего сайта на другой.

Прежде чем работать с данными, нужно убедиться, что:

  • В определенное поле введена информация;
  • Текст в поле адрес имеет форму электронного адреса(с @ и с точкой);
  • Дата рождения разумна, например, пользователь не сообщил о себе, что ему 300 лет или 1 годик.
  • Пароль достаточно сложен и не совпадает с логином.

Проверка может происходить и на стороне клиента, и на сервере. При валидации на стороне клиента в страницу встраивается код на Javascript. Если данные в форме не проходят проверку, страница просто не будет отправлена на сервер. Таким образом избежим лишнего трафика и не будем загружать сервер. С другой стороны, валидации на стороне сервера более надежна. Javascript-код хакеры могут легко посмотреть и отправить неправильные данные, которые пройдут эту проверку. Наконец, Javascript можно просто выключить в настройках браузера. При валидации на стороне сервера данные проверяются программой на полноценном языке. Ее код пользователю неизвестен. В результате проверки генерируется новая страница с сообщениями об ошибках. Самая разумная стратегия — применять комбинацию этих методов. Предварительная проверка у клиента защитит от опечаток, а серьезная проверка на сервере — от злонамеренного взлома.

Существует целый ряд серверных элементов управления, которые не занимаются выводом информации, а проверяют данные, введенные пользователем. ASP.NET 2.0 сам определяет тип браузера и генерирует наиболее подходящий для данного случая код, который. Если браузер поддерживает Javascript-код, который он может послать, то валидация или ее часть происходит на стороне клиента. Если браузер не поддерживает Javascript, то вся валидация происходит на сервере.

Получить доступ к валидаторам просто — раскройте в Toolbox вкладку Validation.

Класы валидаторов образуют иерархию, во главе которой стоит абстрактный класс BaseValidator.

Базовый класс валидаторов сам наследник класса Label, так что по существу все валидаторы — метки, текст в которых становится видимым, когда не выполняются определеннные нами условия проверки. По умолчанию текст в валидаторах красный. (Вспомните школу и замечания учительнице в тетради). Но конечно же, этот цвет поменять на более приятный. Все валидаторы имеют свойство ControlToValidate. Оно задает тот контрол, данные в котором проверяются данными валидатором. Этот элемент должен находиться в одном контейнере с валидатором.

Общие свойства валидаторов
Display Предоставлять ли место статически или динамически
EnableClientScript Разрешать ли генерировать клиентский код
ErrorMessage Текст сообщения об ошибке
IsValid Прошел ли валидацию связанный с валидатором элемент

Инициация проверки данных

Проверка всегда инициируется каким-либо событием. Обычно это щелчок на кнопках Button, ImageButton, LinkButton, в которые по умолчанию свойство CausesValidation установлено в true. Можно убрать это свойство для некоторых кнопок, которым оно не нужно, например, кнопки Cancel.

В примере с автосалоном на странице имеются несколько валидаторов.

Класс RequiredFieldValidator проверяет, было ли изменено значение в связанном с ним элементе управления. Если, как в данном случае, это выпадающий список, первоначально выбрано пустое значение, но требуется, чтобы пользователь выбрал конкретную марку. Если не выбрал, но нажал кнопку submit, валидация проваливается и выводится текст, заданный в ErrorMessage или в Text. Валидаторы отображают текст указанный в свойстве «Text», всегда, когда оно не пусто, а текст установленный в свойстве «ErrorMessage», тогда, когда свойство «Text» равно «». Первоначальное значение задается свойством InitialValue. Если это свойство не задано, то проверка проводится на отсутствие значения (например, пустой Textbox).

Для проверки корректности ввода электронного адреса используется класс RegularExpressionValidator.

ValidationExpression — регулярное выражение, на соответствие которому проходит проверку значение текстового поля. в Visual Studio 2005 предоставляет несколько готовых шаблонов регулярных выражений, которые можно выбрать в окне свойств — телефонных номеров разных стран, адресов, и, самое полезное, шаблоны электронной почты и адреса в интернете.

С одним элементом управления может быть связано несколько валидаторов. Например, электронный адрес проверяется и на соответствие шаблону, и на обязательное заполнение.

Свойство Page.IsValid позволяет определить, прошла ли вся страница валидацию. Для браузеров, которые поддерживают DHTML, проверка происходит на стороне клиента. Для этого автоматически генерируется JavaScript-код. Таким образом экономятся ресурсы сервера и трафик, которые бы пришлось потратить на передачу неправильных данных.

Валидаторы сравнения

CompareValidator сравнивает значение со значением в другом элементе управления или с константой. Также можно проверить, можно ли конвертировать значение в связанном с ним элементе управления в какой-либо тип.

Свойство Operator позволяет установить операцию, посредством которой происходит сравнение: Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual. Значение DataTypeCheck означает проверку на соответствие типу.

Свойство Type может принимать значения String, integer, Date, Double и Currency.

Свойство ControlToCompare задает элемент управления, с которым происходит сравнение. ValueToCompare задает значение. Из этих двух свойств установленным может быть только одно.

RangeValidator проверяет соответствие введенного значения диапазону, заданному своствами MinValue и MaxValue.

ValidationSummary

Класс ValidationSummary позволяет вывести итоговую информацию по всем валидаторам на странице. Она может быть выведена в различной форме:

  • BulletList — список со значками
  • List — обычный список
  • SingleParagraph — простой параграф

Информацию можно выводить на странице, а можно в информационном окне, если ShowMessage поставить в True. Для всех валидаторов выводится свойство Error Message, а не текст. Text выводится в самом валидаторе.

Вернемся к странице Registration.aspx. Добавим в него еще одно поле для ввода пароля.

Свойство CausesValidation работает, когда элемент управления теряет фокус. В таком случае связанный с ним валидатор показывает значение своего свойства Text.

Нам нужно, чтобы имя было обязательно введено, а пароль совпадал в обоих текстовых полях.

Перетащите RequiredFieldValidator и бросьте его на форму. ControlToValidate установите в txtName. Второй валидатор — RequiredFieldValidator для пароля. Третий — CompareValidator, который сравнивает значение паролей.

А также один ValidationSummary:

Поставим кнопку, при нажатии на которую будет происходить проверка.

Обработчик нажатия на кнопку подтверждает ввод, если валидация прошла успешно:

Вся проверка этой страницы происходит у клиента. Можете даже остановить сервер, чтобы в этом убедиться. Только когда все данные введены правильно, происходит отправка формы на сервер.

CustomValidator

Если нужно сделать такую проверку, которую не получается осуществить с помощью стандартных валидаторов, в игру вступает CustomValidator. В классе CustomValidator можно написать любую функцию, которая будет проверять значения как на стороне сервера, так и у клиента. Классический пример — проверка числа на четность.

Напишем пользователький валидатор, который будет проверять пароль на длину — не меньше 5 символов.

Проверка происходит на стороне клиента функцией на JavaScript validatePassword. Для этого надо в свойстве ClientValidationFunction записать имя функции. В сгенерированном коде к кнопке привязан такой код:

Известно, что если функция, связанная с onclick, вернет логическое значение false, форма не будет отправлена на сервер.

Произведем такую же валидацию на сервере. Чтобы запустить проверку на сервере, используется свойство OnServerValidate. Функция, которая указана в ней, входит в класс страницы и должна быть написана на C#:

ServerValidate вызывается после события Page_Load, поэтому нельзя, как в лекции 3, выводить результаты в Page_Load.

Можно также одновременно проводить и клиентскую, и серверную валидацию:

Чтобы отключить возможность генерации клиентского кода для всех валидаторов, можно написать:

Для отображения сообщения об ошибке можно использовать звуки и картинки. Для этого в свойство ErrorMessage нужно записать не текст, а соответствующих тег HTML, например:

Группы валидации.

Иногда бывает нужно иметь на странице несколько кнопок, и при нажатии на каждую вводится информация из логически взаимосвязанных групп элементов управления. Поэтому должны проверяться значения только из этой группы. У всех валидаторов и элементов управление, через которые возможен ввод информации, есть свойство ValidationGroup. Функцию Page.Validate() тоже можно использовать с таким параметром. Если происходит нажатие на кнопку с установленным ValidationGroup, запускается проверка тех валидаторов, у которых это свойство такое же.

Заключение

Назначение форм в том, чтобы получать данные от пользователей, но данные не имеют смысла, если они введены неправильно. Элементы-валидаторы позволяют автоматизировать рутинные действия по проверке данных и гарантировать ввод данных, соответствующих нашим требованиям.

Wrong Date is calculated for rollover filePattern with timezone parameter

Details

Windows 8
Log4j2 2.8.2

Description

Wrong Date is calculated for rollover filePattern with timezone parameter.
Due to <UTC+0> calculated date is wrong.
current date is : 20200602 but the calculated one while rolling over is : 20200601 , file name: rollapp-20200601-1.log

Configurations used are:

Attachments

LOG4J2-1631 RollingFile appender does not rollover file as per TimeZone specified

  • Open
    The issue is open and ready for the assignee to start work on it. «>Open

Is there a safe way to force an IIS log file rollover on a production web server?

I often have to look at problems on live web servers, would like to know if there is a safe way to force an IIS log file rollover on a production server.

3 Answers 3

You could try temporarily changing the log file rollover settings, as described here:

Once the logs have rolled over, revert to your previous settings.

Are you sure about this, I’ve been supporting IIS web farms for years and had no issues with copying the current IIS log file to get all entries up to that point. (IIS 4,5,6 and 7)

How are you copying them?

If you have the ability to take the server out of rotation, or you’re working on a test server, then one option is to rename the current log file. IIS will then create a new one. For example, if you want to capture logs for one hour without having to filter them out of a larger file:

  • Take server out of rotation and stop IIS
  • Rename the latest log file
  • Start IIS, put server back into rotation
  • IIS creates a new log file
  • Wait one hour
  • Copy the latest log file, and you have a file with one hour of log data

Not the answer you’re looking for? Browse other questions tagged windows iis log-files or ask your own question.

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.12.35412

12 Logging Events, Diagnostics, and Access Information

This chapter explains how to use OracleAS Web Cache event and access logs.

This chapter contains these topics:

12.1 Evaluating Event Logs

OracleAS Web Cache events and errors are stored in an event log. The event log can help you determine which documents or objects have been inserted into the cache. It can also identify listening port conflicts or startup and shutdown issues. By default, the event log has a file name of event_log and is stored in $ORACLE_HOME/webcache/logs on UNIX and ORACLE_HOME \webcache\logs on Windows.

This section contains the following topics:

See Also:

Chapter 16 for descriptions of the event log messages

12.1.1 Format of the Event Log File

Event messages are written using either of the following formats:

The default format displays a typical log message for each instance of an event. It displays the request ID and sequence number of the Oracle-ECID request header so that you can easily find the matching request detail line.

The request detail format is displayed when you enable Include Request Details. The field [detail] indicates that the event is for a request. This format is logged the first time an event is logged for a request. In addition to the IP address, site name, and URL of the request, the ID and sequence number of the Oracle-ECID request header is logged. The Oracle-ECID request header is used to track requests.

Table 12-1 describes the fields for the default event log format.

Table 12-1 Event Log Format

Fields Description
[ Timestamp ] Date when the event occurred. Time is displayed in either local or Greenwich Mean Time.
[ severitymessage_id ] Severity level and message ID of event log message. Severity level can be one of the following:

internal error : An event that occurs due to a bug

alert : An event that affects the entire OracleAS Web Cache instance and causes a lack of service in subsequent request/response transaction

error : An event that causes a lack of service only within the request/response transaction

warning : An event which is abnormal or potentially a sign of some problem

notification : An event that provides current status

trace : An event that indicates a trace activity

debug : An event that is a trace activity intended for Oracle Support Services and development

[ecid: request_id , serial_number ] Request ID and hop-sequence number from the Oracle-ECID request header
Event_Log_Message Event message

Table 12-2 describes the fields for the request detail format.

Table 12-2 Event Log Format for Request Details

Fields Description
[Timestamp] Date when the event occurred. Time is either displayed in local or Greenwich Mean Time.
[detail] Request detail event
[ecid: request_id , serial_number ] Request ID and sequence number from the Oracle-ECID request header
[client: IP_address ] IP address of the browser that made the request
[host: site ] Site name of the request
[url: URL ] URL of the request

See Also:

«Oracle-ECID Request-Header Field» for a more detailed description of the Oracle-ECID request header

«Configuring Event Logs» for further information about enabling the Include Request Details feature

12.1.2 Configuring Event Logs

To configure the event log settings:

Start OracleAS Web Cache Manager.

See Also:

In the navigator frame, select Logging and Diagnostics > Event Logs.

The Event Logs page appears.

Specify cache-specific event log settings:

From the Cache-Specific Event Log Configuration table, select a cache, and then click Edit Selected.

The Edit Cache-Specific Event Log Configuration dialog box appears.

In the Directory field, enter the directory in which to write event logs.

The default is $ORACLE_HOME/webcache/logs on UNIX and ORACLE_HOME \webcache\logs on Windows.

In the Buffering field, select Enabled to enable buffered logging or Disabled to disable buffered logging.

With buffered logging, OracleAS Web Cache writes to the event log after the buffer is full. The buffer size is set 2048 bytes. When the limit is reached, OracleAS Web Cache writes buffered events to the event log file.

Oracle Corporation recommends disabling buffering when you need to see the event log results immediately, such as when you are debugging OracleAS Web Cache.

If buffering is enabled, set the frequency at which buffered events are written to the event log file in the Flush Interval field.

The default is 10 seconds. When the interval is reached, OracleAS Web Cache writes buffered events to the event log file. Even if the buffer is not full, the event log is updated at least every 10 seconds. Oracle Corporation recommends not changing the default unless you need to lower the interval to see results more frequently.

From the Verbosity list, select the needed level of detail for the event log. The levels are described in Table 12-3.

Table 12-3 Verbosity Levels

Level Description
WARNING Provides abnormal-operation events.
NOTIFICATION Provides normal-operation events, such as startup and shutdown. This is the default.
TRACE Provides events for debugging caching rules.
DEBUG Provides detailed events for troubleshooting. This level is intended for Oracle Support Services.

Click Submit.

Set the global event log settings:

From the Global Event Log Configuration table, click Edit.

The Edit Global Event Log Configuration dialog box appears.

In the File Name field, enter a name for the event log file.

The default file name is event_log .

From the Time Style list, select either LOCAL or GMT to modify the time stamp style associated with entries in the event log file.

Note:

Oracle Corporation recommends using GMT whenever possible. Local can be CPU-intensive, because of the conversion process from GMT to Local time. This conversion process is supplied by the operation system. As such, OracleAS Web Cache has no mechanism to improve the performance of the conversion process.

In Include Request Details, select Yes to enable the logging of request details or No to disable logging of requests.

Oracle Corporation recommends selecting No if either of the following conditions apply:

You are concerned about the performance impact of event log entries for request details

You are running OracleAS Web Cache in a standalone environment without Oracle HTTP Server

See Also:

«Format of the Event Log File» for further information about how request details are logged

Appendix C for information about running OracleAS Web Cache in a standalone environment

In the Rollover Policy section, select Weekly, Daily, Hourly, or Never to specify how often you want OracleAS Web Cache to save current log information to event_log_file.yyyymmdd and write new log information to the current event log file.

Table 12-4 describes additional configuration instructions for Weekly, Daily, and Hourly.

Table 12-4 Configuring Weekly, Daily and Hourly Rollover Policies

Policy To configure:
Weekly
    Select a day of the week.

Use the Time fields to enter the hour and minutes.

From the Time Style list, select either Local or GMT.

Daily
    From the Rollover times — each day list, select a time. If the time you require does not exist, use the Time fields to enter the hour and minutes.

    From the Time Style list, select either Local or GMT.

Hourly
    From the Rollover times — minutes past the hour list, select a time. If the time you require does not exist, use the Minutes past the hour field to enter the number of minutes, and then click Add.

    From the Time Style list, select either Local or GMT.

    If you have a high-volume site, create a daily or hourly policy.

    See Also:

    «Rolling Over Event and Access Logs » for instructions on immediately rolling over log files

Click Submit.

Apply changes and restart OracleAS Web Cache:

In the OracleAS Web Cache Manager main window, choose Apply Changes.

In the Cache Operations page, choose Restart to restart OracleAS Web Cache.

12.1.3 Event Log Examples

This section contains the following event log examples:

Example: Event Log with Startup Entries

The following shows an event log excerpt with successful startup entries:

Example: Event Log with Unsuccessful Startup Entries

The following shows an event log excerpt with unsuccessful startup events. OracleAS Web Cache is unable to listen on port 7777, because it is already in use. This can occur if OracleAS Web Cache is already running and listening on that port or another application is using that port.

Example: Event Log with Shutdown Entries

The following shows an event log excerpt with typical shutdown entries:

Example: Event Log with Cache Miss and Cache Hit Entries

The following shows an event log excerpt containing events for a cache-miss request:

The following shows an event log excerpt containing events for a subsequent cache-hit request:

Example: Event Log with an Invalidation Entry

The following shows an event log excerpt with an event associated with an invalidation request for the removal of document cache.htm .

Example: Event Log with Invalidation Request Errors

The following shows an event log excerpt with an XML invalidation request error. In this example, OracleAS Web Cache is unable to parse the request.

Example: Event Log with ESI Parsing Errors

The following shows an event log excerpt with ESI parsing errors that indicate a problem with the src attribute and variable syntax:

Example: Event Log with ESI Processing Errors

The following shows an event log excerpt with ESI processing errors that indicate an error fetching an ESI fragment named a.html and an unknown fragment for an undefined site:

12.2 Displaying Diagnostic and Event Log Information in the HTML Body or Server-Response Header Field

By default, OracleAS Web Cache adds diagnostics information to the Server -response header field:

For diagnostics purposes, it can be useful to also display this information in the HTML response body of a document. Once enabled, you simply append a string to the URL of the document into the browser to see the diagnostic information string embedded in the response body. In addition to diagnostics information, you can optionally display event log information, with a verbosity level of TRACE, in the HTML response.

See Also:

Table 2-4 for a detailed description of the diagnostic information displayed

To configure where to display diagnostic information:

In the navigator frame, select Logging and Diagnostics > Diagnostics.

The Diagnostics page appears.

From the Cache-Specific Page Body Diagnostics table, select a cache, and then click Enable to display diagnostic information in the HTML response body or Disable to disable the display of diagnostic information in the HTML response body.

To set diagnostic settings for the HTML response body:

Click Edit.

The Edit Global Page Body Diagnostics Configuration dialog box displays.

In the URL Flag field, enter the string to append to the URL of the document.

By default, the string is set to +wcdebug .

In the Display Event Log Entries for Request field, select Yes to display diagnostic information and TRACE event log entries in the HTML response body, or select No to only display diagnostic information.

Click Submit.

To enable or disable diagnostic settings in the Server response header, from the Global Server Header Diagnostics table, click Enable or Disable.

Note:

When a page is compressed, OracleAS Web Cache does not add debug information.

12.3 Evaluating Access Logs

OracleAS Web Cache generates an access log that contains information about the HTTP requests sent to OracleAS Web Cache. By default, the access log has a file name of access_log and is stored in $ORACLE_HOME/webcache/logs on UNIX and ORACLE_HOME \webcache\logs on Windows.

This section contains the following topics:

See Also:

Oracle Application Server 10g Administrator’s Guide for further information about managing log files with Oracle Enterprise Manager

12.3.1 Format of the Access Log File s

You can configure the content of the access log files by defining the fields to appear for each HTTP request event. These fields are based on the Extended LogFile Format (XLF). By default, OracleAS Web Cache provides support the following log formats:

This format is the default format applied to access logs. This format is appropriate for most configurations.

The CLF format provides support for the following fields:

The combined format provides support for the CLF fields and the following additional fields:

Select this format when you need to determine what kind of browser is sending the request, and where the browser was visiting before the request was forwarded to OracleAS Web Cache.

Web Cache Log Format (WCLF)

This format provides support for the following fields intended for end-user performance monitoring features:

If the default formats are not suitable for your configuration, you can specify the fields that you require. Table 12-5 describes the supported fields. Fields prefixed with x or r are proprietary to OracleAS Web Cache.

Table 12-5 Access Log Fields

Field Description
bytes Content length of the request
c-ip IP address of the browser
cached Integer that specifies cache status. Cache status is reported as one of the following:

0 specifies a cache miss. Equivalent to M , U , G , and N output of x-cache field.

1 specifies a cache hit of a stale document. Equivalent to S output of x-cache field.

2 specifies a cache hit. Equivalent to H output of x-cache field.

cs( header_name ) HTTP request header sent from the browser
cs-bytes Bytes received from the browser
cs-method Browser-to-OracleAS Web Cache HTTP request method
cs-uri Browser-to-OracleAS Web Cache URI
cs-uri-query Browser-to-OracleAS Web Cache query portion of URI, omitting the stem
cs-uri_stem Browser-to-OracleAS Web Cache stem portion of URI, omitting the query
date Date the transaction completed, in the following format:
r-ip IP address and port number of origin server. For a cache cluster, this field displays the IP and port number of a peer cache in the cache cluster. The information is displayed in the following format:
r-time-taken Time, in seconds (including microseconds), that OracleAS Web Cache spent communicating with the origin server or peer cache. The time is the duration between the following two points of time:

The time immediately before OracleAS Web Cache sent the first byte of the request to the origin server or peer cache.

The time immediately after receiving the last byte of the response from the origin server or peer cache.

This field is particularly helpful in providing time information for End-User Performance Monitoring.

s-ip IP address of OracleAS Web Cache computer
sc( header_name ) HTTP response header sent from OracleAS Web Cache to the browser
sc-status OracleAS Web Cache-to-browser HTTP status code:

1xx range messages are informational

2xx range messages indicate success

3xx range messages indicate redirection, that is, further action must be taken to complete the request

4xx range messages indicate a client error

5xx range messages indicate a OracleAS Web Cache error

See Also: http://www.ietf.org/rfc/rfc2616.txt for further information about HTTP status codes

time Time at which the response from OracleAS Web Cache completed. The time is displayed in the following format:
time-taken Amount of time taken, in seconds (including microseconds), for the transaction to complete
x-auth-id User name of a basic HTTP authentication request
x-cache Cache status. Cache status is reported as one of the following:

H specifies a cache hit

S specifies a cache hit of a stale document

U specifies a cache update of a stale document

G specifies a cache update of a document that was marked for removal but still physically resides in the cache

M specifies a cacheable cache miss

N specifies a non-cacheable cache miss

x-cache-detail Diagnostic information, in the following format:

<ESI_processing_type > <cache_request_type > [;max-age= expiration_time [+ removal_time ] ;age= document_age ]

ESI_processing_type can be one of the following:

T specifies that the document is an ESI template

F specifies that the document is an ESI fragment

Empty specifies that the response does not require ESI processing

cache_request_type can be one of the following:

H specifies a cache hit

S specifies a cache hit of a stale document

U specifies a cache update of a stale document

G specifies a cache update of a document that was marked for removal but still physically resides in the cache

M specifies a cacheable cache miss

N specifies a non-cacheable cache miss

max_age specifies the time, in seconds, to expire the document, and optionally, the time, in seconds, to remove the document from the cache after the expiration time. max_age does not appear if the cache_request_type is N .

age shows how long, in seconds, the document has been in the cache. age does not appear if the document is non-cacheable.

Example: H;max-age=60+30;age=50

H means that this request resulted in cache hit

max-age=60+30 means that the document is to expire in 60 seconds from population and to be removed from the cache 30 seconds from the expiration. This provides a total of 90 seconds from population.

age=50 means that 50 seconds have passed since population of the cache, meaning there is 10 seconds to expiration and 40 seconds to removal

x-cache-key Cache key value, in the following format:
x-clf-date Date that the response from OracleAS Web Cache completed, in the following format:
x-cluster Single character that specifies the status of a cache cluster. The character is reported as one of the following:

T specifies a request to a cache cluster member

F specifies a request from a cache cluster member

O specifies a request for owned content

D specifies a request for on-demand content

x-cookie( cookie_name ) Cookie value from browser request.
x-date-start Date before OracleAS Web Cache received the first byte of the request, in the following format:
x-date-end Date when OracleAS Web Cache sent the last byte of the response, in the following format:
x-ecid ID of the specified in Oracle-ECID request header, in the following format:
x-esi-info ESI fragment log message from the log element of or tags. It uses the following format:

The log message only displays for requested ESI fragments in the access_log_file .fragment file. When a request ESI fragment is not configured with the log element, this field displays as a hyphen (-)

x-log-id Login user name of the client. OracleAS Web Cache is unable to obtain the value for this field. Therefore, OracleAS Web Cache displays a hyphen ( -) in the output when this field is set.
x-os-name Origin server or cache cluster member that OracleAS Web Cache is forwarding the request, in the following format:
x-os-timeout Single character that specifies if the origin server timed out on a request. The character is reported as one of the following:

0 specifies that the origin server did not timeout

1 specifies that the origin server did timeout. An output of 1 can indicate a problem with the origin server itself.

x-protocol Protocol and version from browser request, in the following format:
x-req-line Request line, in the following format:

» HTTP_request_method URI protocol/version «

Example: «GET /cache.htm HTTP/1.1»

x-req-type Request type. Request type is reported as one of the following:

B specifies that the request is from the browser

C specifies that the request is from another cache cluster member

H specifies that the request is from another cache cluster or an OracleAS Web Cache that is not a member of the current cache cluster

F specifies that the request is for an ESI fragment

x-time-delay Time, in seconds (including microseconds), that OracleAS Web Cache spent communicating with the origin server or peer cache. The time is the duration between the following two points of time:

    The time immediately before OracleAS Web Cache received the first byte of the request

    The time immediately before OracleAS Web Cache sent the first byte of the request to the origin server or peer cache.

    This field is particularly helpful in providing time information for End-User Performance Monitoring.

x-time-end Time that OracleAS Web Cache sent the last byte of the response, in the following format:
x-time-handshake The difference between the time the browser initiates a new connection and the time at which OracleAS Web Cache receives the first byte of the HTTP request.

Note: Select this field only if instructed by Oracle Support Services.

x-time-reqrecvlatency The difference between the time at which OracleAS Web Cache receives the first and last byte of the HTTP request. This field indicates the time in reading the browser requests.

Note: Select this field only if instructed by Oracle Support Services.

x-time-reqsendlatency The difference between the time at which OracleAS Web Cache sends the first and last byte of the HTTP request to the origin server. This field indicates the time taken in sending the request to the origin server.

Note: Select this field only if instructed by Oracle Support Services.

x-time-resprecvlatency The difference between the time at which OracleAS Web Cache receives the first and last byte of the HTTP response from the origin server. This field indicates the time taken in receiving the response from the origin server.

Note: Select this field only if instructed by Oracle Support Services.

x-time-respsendlatency The difference between the time at which OracleAS Web Cache sends the first and last byte of the HTTP response to the browser. This field indicates the time taken in sending the response to the client.

Note: Select this field only if instructed by Oracle Support Services.

x-time-reqblocked The difference between when a request was blocked and unblocked because of garbage collection. If a request has already been sent to the origin server by OracleAS Web Cache to update an existing document, OracleAS Web Cache blocks all subsequent requests.

Note: Select this field only if instructed by Oracle Support Services.

x-time-reqqueued The difference between when a request is queued and dequeued for the origin server. This field indicates the time a request spends in OracleAS Web Cache backend queue for an origin server (due to the maximum origin server capacity being reached) before the request is sent to the origin server for processing.

Note: Select this field only if instructed by Oracle Support Services.

x-time-start Time before OracleAS Web Cache received the first byte of the request, in the following format:

12.3.1.1 cs(header_name) and sc(header_name) Access Log Fields

Table 12-6 lists examples of HTTP/1.1 headers that can be used for the cs( header_name ) and sc( header_name ) fields. This table lists only some of the possible headers. It is not an exhaustive list.

Table 12-6 Examples of HTTP/1.1 Header Fields

cs(header_name) Field sc(header_name) Field
Accept Cache-Control
Authorization Content-Encoding
Connection Content-Language
Date Content-Length
Host Content-Type
Referer Date
Cache-Control ETag
Content-Encoding Expires
Content-Language Last-Modified
Content-Length Pragma
Content-Type Server
If-None-Match Transfer-Encoding
If-Modified-Since Via
Last-Modified
Pragma
Range
TE
User-Agent
Via

Table 12-7 lists examples of cookie-related headers that can be used for the cs( header_name ) and sc( header_name ) fields.

Table 12-7 Supported Cookie-Related Header Fields

cs(header_name) Field sc(header_name) Field
Cookie Set-Cookie

Table 12-8 lists examples of OracleAS Web Cache headers that can be used for the cs( header_name ) and sc( header_name ) fields.

Table 12-8 Supported OracleAS Web Cache Header Fields

cs(header_name) Field sc(header_name) Field
Surrogate-Capability Surrogate-Control

12.3.2 Configuring Access Logs

To establish access log configuration settings:

Start OracleAS Web Cache Manager.

See Also:

In the navigator frame, select Logging and Diagnostics > Access Logs.

The Access Logs page appears.

Specify cache-specific access log settings:

From the Cache-Specific Access Log Configuration table, select a cache, and then click Edit Selected.

The Edit Cache-Specific Access Log Configuration dialog box appears.

In the Directory field, enter the directory in which to write access logs.

The default is $ORACLE_HOME/webcache/logs on UNIX and ORACLE_HOME \webcache\logs on Windows.

In the Enabled field, select Yes to enable logging, or No to disable logging.

In the Buffering field, select Enabled to enable buffered logging or Disabled to disable buffered logging.

With buffered logging, OracleAS Web Cache writes to the access log after the buffer is full. The buffer size is set 2048 bytes. When the limit is reached, OracleAS Web Cache writes buffered events to the access log file.

Oracle Corporation recommends disabling buffering when you need to see the access log results immediately.

In the Flush Interval field, set the frequency at which buffered information is written to the access log file.

The default is 10 seconds. When the interval is reached, OracleAS Web Cache writes buffered information to the access log file. Even if the buffer is not full, the access log is updated at least every 10 seconds. Oracle Corporation recommends not changing the default, unless you need to lower the interval to see results more frequently.

Click Submit.

Specify site-specific log settings:

From the Site-Specific Access Log Configuration table, click Add.

The Edit/Add Site Specific Access Log Configuration dialog box appears.

From the For Site list, select the Web site for which to specify access log settings.

In the File Name field, enter a name for the access log file.

The default file name is access_log .

In the Enabled field, select Yes to enable logging for the site or No to disable logging for the site.

Site-specific logging only takes effect if logging is enabled for the cache. If you select Yes, ensure that Yes is also selected for the cache in Step 3c.

In the ESI Fragment Requests field, select Log to log the ESI fragment log messages from the log element of or in the access_log_file .fragment file.

If the x-esi-info field is selected, select Log to log the events to the access_log_file .fragment file. If the x-esi-info field is not selected, select Don’t Log. The x-esi-info field is automatically selected if the Format Style is WCLF.

From the Format Style list, select an access log format.

See Also:

«Format of the Access Log Files» for a description of the CLF, Combined, and WCLF formats

From the Rollover Policy list, select a rollover policy to specify how often you want to change the frequency at which OracleAS Web Cache saves current log information to access_log_file . yyyymmdd and writes new log information to the current access log file.

For high-volume sites, select a policy with a high frequency.

Click Submit.

If the CLF, Combined, and WCLF formats are not suitable for your environment, create a log format that is:

From the User-Defined Log Formats table, click Add.

The Edit/Add User-Defined Access Log Format dialog box displays.

In the Format Name field, enter a unique name for the format.

From the Separator list, select the separator to use for separating access log fields.

In Print XLF Directive field, select Yes to include XLF directive information at the top of the access log or No to not include directive information in the access log.

Directive information typically consists of version and date information. For example:

See Also:

http://www.w3.org/TR/WD-logfile.html for further information about XLF directives

In the XLF Fields section, select an access log field name from the Field name list.

See Also:

Table 12-5 for a listing of the supported access logs fields

If you selected field cs( header_name ) , sc( header_name ) , or x-cookie( cookie_name ) , then enter the header or cookie name in the Header/Cookie name field.

See Also:

Table 12-6, Table 12-7, and Table 12-8 for a description of the headers allowed for cs( header_name ) and sc( header_name )

Click Add.

Perform Steps e and f for each format you want in the access log, and then use the Move Up and Move Down buttons to order the fields. The order in which fields are entered determines the order in which the fields are logged.

Click Submit.

Optionally, modify or create rollover policies:

Select an existing policy and click Edit Selected to modify and existing rollover policy, or click Add to create a new policy.

The Edit/Add Access Log Rollover Policy dialog box appears.

In the Rollover Policy Name field, enter the a unique name for the rollover policy.

In Rollover Policy section, select Weekly, Daily, Hourly, or Never to specify how often you want OracleAS Web Cache to save current log information to access_log_file.yyyymmdd and write new log information to the current access log file.

Table 12-9 describes additional configuration instructions for Weekly, Daily, and Hourly.

Table 12-9 Configuring Weekly, Daily and Hourly Rollover Policies

Policy To configure:
Weekly
    Select a day of the week.

Use the Time fields to enter the hour and minutes.

From the Time Style list, select either Local or GMT.

Daily
    From the Rollover times — each day list, select a time. If the time you require does not exist, use the Time fields to enter the hour and minutes, and then click Add.

    From the Time Style list, select either Local or GMT.

Hourly
    From the Rollover times — minutes past the hour list, select a time. If the time you require does not exist, use the Minutes past the hour field to enter the number of minutes, and then click Add.

    From the Time Style list, select either Local or GMT.

    If you have a high-volume site, create a daily or hourly policy.

    See Also:

    «Rolling Over Event and Access Logs » for instructions on immediately rolling over log files

Click Submit.

Apply changes and restart OracleAS Web Cache:

In the OracleAS Web Cache Manager main window, choose Apply Changes.

In the Cache Operations page, choose Restart.

Logging Cache Cluster Peer Requests

By default, peer requests between two members of a cache cluster are not logged in the access log. Only client requests to the cluster are logged. Peer request logging can be enabled for individual cache cluster members by adding the ACCESSLOGIGNOREPEERREQUEST attribute to the MISCELLANEOUS element in the internal.xml configuration file.

The valid values for this attribute are: YES and NO .

The following example shows the MISCELLANEOUS element with peer-to-peer logging enabled:

12.3.3 Analyzing an Access Log File

The following code shows an excerpt of an access log file:

In the first line of the output, the fields have the following meaning:

10.10.150.35 is the browser’s IP address ( c-ip )

[19/Jul/2003:10:27:42 -0500] is the date ( [x-clf-date] )

user/personal.htm HTTP/1.1 » is the request line ( «x-req-line» )

200 is the HTTP status code ( sc-status )

2438 is the size of the document sent ( bytes )

12.3.4 Access Log Examples

This section contains the following access log examples:

Except where noted otherwise, the access log examples use the CLF format:

Example: Access Log with Reload Entries

The following shows an access log excerpt in which there are two Web browser reloads, followed by two shift reloads, and two more reloads:

The third and forth entries return an HTTP status code of 304, indicating that document has not been modified and does not need to be returned again.

Example: Access Log with Status Code 404 Entry

The following shows an access log excerpt in which OracleAS Web Cache cannot find any objects matching the requested URL /ows-img/chalk.jpg . This error is indicated by HTTP status code 404.

Example: Access Log in Combined Format

The following shows an access log excerpt in which the combined format is specified:

Example: Access Log with Site Information

The following shows an access log excerpt in which the following fields are specified:

cs(Host) displays the output of Host request-header field, which specifies the site information. In this example, requests are sent to OracleAS Web Cache for site www.company.com:80 .

Example: Access Log with ESI Diagnostic Information

The following shows an access log excerpt in which the following fields are specified:

x-cache-detail displays diagnostic information. In the following example:

T means that this request is for an ESI template

H means that this request resulted in cache hit

max-age=10+15 means that the document is to expire in 10 seconds from population and to be removed from the cache 15 seconds from the expiration. This provides a total of 25 seconds from population.

age=0 means that 0 seconds have passed since population of the cache, meaning there is 10 seconds to expiration and 15 seconds to removal

Example: Access Log with ESI Log Information

The following shows an access log excerpt in which the following fields are specified:

x-esi-info displays log information from the log element of or tags.

Apache log (логи): как настроить и анализировать журналы веб-сервера

Для эффективного управления веб-сервером необходимо получить обратную связь об активности и производительности сервера, а также о всех проблемах, которые могли случиться. Apache HTTP Server обеспечивает очень полную и гибкую возможность ведения журнала. В этой статье мы разберём, как настроить логи Apache и как понимать, что они содержат.

HTTP-сервер Apache предоставляет множество различных механизмов для регистрации всего, что происходит на вашем сервере, от первоначального запроса до процесса сопоставления URL-адресов, до окончательного разрешения соединения, включая любые ошибки, которые могли возникнуть в процессе. В дополнение к этому сторонние модули могут предоставлять возможности ведения журналов или вставлять записи в существующие файлы журналов, а приложения, такие как программы CGI, сценарии PHP или другие обработчики, могут отправлять сообщения в журнал ошибок сервера.

В этой статье мы рассмотрим модули журналирования, которые являются стандартной частью http сервера.

Логи Apache в Windows

В Windows имеются особенности настройки имени файла журнала — точнее говоря, пути до файла журнала. Если имена файлов указываются с начальной буквы диска, например «C:/«, то сервер будет использовать явно указанный путь. Если имена файлов НЕ начинаются с буквы диска, то к указанному значению добавляется значение ServerRoot — то есть «logs/access.log» с ServerRoot установленной на «c:/Server/bin/Apache24″, будет интерпретироваться как «c:/Server/bin/Apache24/logs/access.log«, в то время как «c:/logs/access.log» будет интерпретироваться как «c:/logs/access.log«.

Также особенностью указания пути до логов в Windows является то, что нужно использовать слэши, а не обратные слэши, то есть «c:/apache» вместо «c:\apache«. Если пропущена буква диска, то по умолчанию будет использоваться диск, на котором размещён httpd.exe. Рекомендуется явно указывать букву диска при абсолютных путях, чтобы избежать недоразумений.

Apache error: ошибки сервера и сайтов

Путь до файла журнала с ошибками указывается с помощью ErrorLog, например, для сохранения ошибок в папке «logs/error.log» относительно корневой папки веб-сервера:

Если не указать директиву ErrorLog внутри контейнера , сообщения об ошибках, относящиеся к этому виртуальному хосту, будут записаны в этот общий файл. Если в контейнере вы указали путь до файла журнала с ошибками, то сообщения об ошибках этого хоста будут записываться там, а не в этот файл.

С помощью директивы LogLevel можно установить уровень важности сообщений, которые должны попадать в журнал ошибок. Доступные варианты:

  • debug
  • info
  • notice
  • warn
  • error
  • crit
  • alert
  • emerg

Журнал ошибок сервера, имя и местоположение которого задаётся директивой ErrorLog, является наиболее важным файлом журнала. Это место, куда Apache httpd будет отправлять диагностическую информацию и записывать любые ошибки, с которыми он сталкивается при обработке запросов. Это первое место, где нужно посмотреть, когда возникает проблема с запуском сервера или работой сервера, поскольку он часто содержит подробности о том, что пошло не так и как это исправить.

Журнал ошибок обычно записывается в файл (обычно это error_log в системах Unix и error.log в Windows и OS/2). В системах Unix также возможно, чтобы сервер отправлял ошибки в системный журнал или передавал их программе.

Формат журнала ошибок определяется директивой ErrorLogFormat, с помощью которой вы можете настроить, какие значения записываются в журнал. По умолчанию задан формат, если вы его не указали. Типичное сообщение журнала следующее:

Первый элемент в записи журнала — это дата и время сообщения. Следующим является модуль, создающий сообщение (в данном случае ядро) и уровень серьёзности этого сообщения. За этим следует идентификатор процесса и, если необходимо, идентификатор потока процесса, в котором возникло условие. Далее у нас есть адрес клиента, который сделал запрос. И, наконец, подробное сообщение об ошибке, которое в этом случае указывает на запрос о несуществующем файле.

В журнале ошибок может появиться очень большое количество различных сообщений. Большинство выглядит похожим на пример выше. Журнал ошибок также будет содержать отладочную информацию из сценариев CGI. Любая информация, записанная в stderr (стандартный вывод ошибок) сценарием CGI, будет скопирована непосредственно в журнал ошибок.

Если поместить токен %L в журнал ошибок и журнал доступа, будет создан идентификатор записи журнала, с которым вы можете сопоставить запись в журнале ошибок с записью в журнале доступа. Если загружен mod_unique_id, его уникальный идентификатор запроса также будет использоваться в качестве идентификатора записи журнала.

Во время тестирования часто бывает полезно постоянно отслеживать журнал ошибок на наличие проблем. В системах Unix вы можете сделать это, используя:

Apache access: логи доступа к серверу

Журнал доступа к серверу записывает все запросы, обработанные сервером. Расположение и содержимое журнала доступа контролируются директивой CustomLog. Директива LogFormat может быть использована для упрощения выбора содержимого журналов. В этом разделе описывается, как настроить сервер для записи информации в журнал доступа.

Различные версии Apache httpd использовали разные модули и директивы для управления журналом доступа, включая mod_log_referer, mod_log_agent и директиву TransferLog. Директива CustomLog теперь включает в себя функциональность всех старых директив.

Формат журнала доступа легко настраивается. Формат указывается с использованием строки формата, которая очень похожа на строку формата printf в стиле C. Некоторые примеры представлены в следующих разделах. Полный список возможного содержимого строки формата смотрите здесь: https://httpd.apache.org/docs/current/mod/mod_log_config.html

Общий формат журнала (Common Log)

Типичная конфигурация для журнала доступа может выглядеть следующим образом.

В первой строке задано имя (псевдоним) common, которому присвоено в качестве значения строка «%h %l %u %t \»%r\» %>s %b«.

Строка формата состоит из директив, начинающихся с символа процента, каждая из которых указывает серверу регистрировать определённый фрагмент информации. Литеральные (буквальные) символы также могут быть помещены в строку формата и будут скопированы непосредственно в вывод журнала. Символ кавычки («) должен быть экранирован путём размещения обратной косой черты перед ним, чтобы он не интерпретировался как конец строки формата. Строка формата также может содержать специальные управляющие символы «\n«для новой строки и «\t» для обозначения таба (табуляции).

В данной строке значение директив следующее:

  • %h — имя удалённого хоста. Будет записан IP адрес, если HostnameLookups установлен на Off, что является значением по умолчанию.
  • %l — длинное имя удалённого хоста (от identd, если предоставит). Это вернёт прочерк если не присутствует mod_ident и IdentityCheck не установлен на On.
  • %u — удалённый пользователь, если запрос был сделан аутентифицированным пользователем. Может быть фальшивым, если возвращён статус (%s) 401 (unauthorized).
  • %t — время получения запроса в формате [18/Sep/2011:19:18:28 -0400]. Последнее показывает сдвиг временной зоны от GMT
  • \»%r\» — первая строка запроса, помещённая в буквальные кавычки
  • %>s — финальный статус. Если бы было обозначение %s, то означало бы просто статус — для запросов, которые были внутренне перенаправлены это обозначало бы исходный статус.
  • %b — размер ответа в байтах, исключая HTTP заголовки. В формате CLF, то есть ‘‘ вместо , когда байты не отправлены.

Директива CustomLog устанавливает новый файл журнала, используя определённый псевдоним. Имя файла для журнала доступа относительно ServerRoot, если оно не начинается с косой черты (буквы диска).

Приведённая выше конфигурация будет сохранять записи журнала в формате, известном как Common Log Format (CLF). Этот стандартный формат может создаваться многими различными веб-серверами и считываться многими программами анализа журналов. Записи файла журнала, созданные в CLF, будут выглядеть примерно так:

Каждая часть этой записи журнала описана ниже.

127.0.0.1 (%h)

Это IP-адрес клиента (удалённого хоста), который сделал запрос к серверу. Если для HostnameLookups установлено значение On, сервер попытается определить имя хоста и зарегистрировать его вместо IP-адреса. Однако такая конфигурация не рекомендуется, поскольку она может значительно замедлить работу сервера. Вместо этого лучше всего использовать постпроцессор журнала, такой как logresolve, для определения имён хостов. Указанный здесь IP-адрес не обязательно является адресом машины, на которой сидит пользователь. Если между пользователем и сервером существует прокси-сервер, этот адрес будет адресом прокси, а не исходной машины.

— (%l)

«Дефис» в выходных данных указывает на то, что запрошенная часть информации недоступна. В этом случае информация, которая недоступна, является идентификационной информацией клиента RFC 1413, определённой с помощью id на клиентском компьютере. Эта информация крайне ненадёжна и почти никогда не должна использоваться, кроме как в жёстко контролируемых внутренних сетях. Apache httpd даже не будет пытаться определить эту информацию, если для IdentityCheck не установлено значение On.

frank (%u)

Это идентификатор пользователя, запрашивающего документ, как определено HTTP-аутентификацией. Такое же значение обычно предоставляется сценариям CGI в переменной среды REMOTE_USER. Если код состояния для запроса равен 401, то этому значению не следует доверять, поскольку пользователь ещё не аутентифицирован. Если документ не защищён паролем, эта часть будет ««, как и предыдущая.

[10/Oct/2000:13:55:36 -0700] (%t)

Время получения запроса. Формат такой:

Можно отобразить время в другом формате, указав %t в строке формата журнала, где формат такой же, как в strftime(3) из стандартной библиотеки C, или один из поддерживаемых специальных токенов. Подробности смотрите в строках формате строки mod_log_config.

«GET /apache_pb.gif HTTP/1.0» (\»%r\»)

Строка запроса от клиента указана в двойных кавычках. Строка запроса содержит много полезной информации. Во-первых, клиент использует метод GET. Во-вторых, клиент запросил ресурс /apache_pb.gif, и в-третьих, клиент использовал протокол HTTP/1.0. Также возможно зарегистрировать одну или несколько частей строки запроса независимо. Например, строка формата «%m %U%q %H» будет регистрировать метод, путь, строку запроса и протокол, что приведёт к тому же результату, что и «%r«.

200 (%>s)

Это код состояния, который сервер отправляет обратно клиенту. Эта информация очень ценна, потому что она показывает, привёл ли запрос к успешному ответу (коды начинаются с 2), к перенаправлению (коды начинаются с 3), к ошибке, вызванной клиентом (коды начинаются с 4), или к ошибкам в сервер (коды начинаются с 5). Полный список возможных кодов состояния можно найти в спецификации HTTP (RFC2616 раздел 10).

2326 (%b)

Последняя часть указывает размер объекта, возвращаемого клиенту, не включая заголовки ответа. Если контент не был возвращён клиенту, это значение будет ««. Чтобы записать «» без содержимого, вместо %b используйте %B.

Логи комбинированного формата (Combined Log)

Другая часто используемая строка формата называется Combined Log Format. Может использоваться следующим образом.

Этот формат точно такой же, как Common Log Format, с добавлением ещё двух полей. Каждое из дополнительных полей использует директиву начинающуюся с символа процента %<заголовок>i, где заголовок может быть любым заголовком HTTP-запроса. Журнал доступа в этом формате будет выглядеть так:

Дополнительными полями являются:

«http://www.example.com/start.html» (\»%i\»)

Referer — это часть заголовок HTTP-запроса, которая называется также Referer. В этой строке содержится информация о странице, с которой клиент был прислан на данный сайт. (Это должна быть страница, которая ссылается или включает /apache_pb.gif).

«Mozilla/4.08 [en] (Win98; I ;Nav)» (\»%i\»)

Заголовок HTTP-запроса User-Agent. Это идентифицирующая информация, которую клиентский браузер сообщает о себе.

Настройки логов в Apache по умолчанию

По умолчанию в главном конфигурационном файле Apache прописаны следующие настройки логов:

Как можно увидеть, установлены три псевдонима: combined, common и combinedio. При этом по умолчанию используется common. При желании вы без труда сможете переключиться на combined или настроить формат строки лога под свой вкус.

Например, если вы предпочитаете, чтобы в файле лога доступа также присутствовала информация о пользовательском агенте и реферере, то есть Combined Logfile Format, то вы можете использовать следующую директиву:

Илон Маск рекомендует:  Что такое код fdf_add_template
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL