Spec-Zone.ru › Apache HTTP Server

Выражения в Apache HTTP Server

Исторически существуют несколько синтаксических вариантов выражений, используемых для выражения условия в различных модулях Apache HTTP Server. В настоящее время предпринимаются усилия по использованию только одного варианта, называемого ap_expr, для всех директив конфигурации. Этот документ описывает парсер выражений ap_expr.

Выражение ap_expr предназначено для замены большинства других вариантов выражений в HTTPD. Например, устаревшие SSLRequire выражения могут быть заменены на Require expr.

Грамматика в обозначении Бэкуса-Наура

Форма Бэкуса-Наура (BNF) — это метод обозначения контекстно-свободных грамматик, часто используемый для описания синтаксиса языков в вычислениях. В большинстве случаев выражения используются для выражения булевых значений. Для этого начальная точка в BNF — expr. Однако некоторые директивы, например LogMessage, принимают выражения, которые вычисляются в строковое значение. Для них начальной точкой в BNF является string.

expr        ::= "true" | "false"
              | "!" expr
              | expr "&&" expr
              | expr "||" expr
              | "(" expr ")"
              | comp

comp        ::= stringcomp
              | integercomp
              | unaryop word
              | word binaryop word
              | word "in" "{" wordlist "}"
              | word "in" listfunction
              | word "=~" regex
              | word "!~" regex


stringcomp  ::= word "==" word
              | word "!=" word
              | word "<"  word
              | word "<=" word
              | word ">"  word
              | word ">=" word

integercomp ::= word "-eq" word | word "eq" word
              | word "-ne" word | word "ne" word
              | word "-lt" word | word "lt" word
              | word "-le" word | word "le" word
              | word "-gt" word | word "gt" word
              | word "-ge" word | word "ge" word

wordlist    ::= word
              | wordlist "," word

word        ::= word "." word
              | digit
              | "'" string "'"
              | """ string """
              | variable
              | rebackref
              | function

string      ::= stringpart
              | string stringpart

stringpart  ::= cstring
              | variable
              | rebackref

cstring     ::= ...
digit       ::= [0-9]+

variable    ::= "%{" varname "}"
              | "%{" funcname ":" funcargs "}"

rebackref   ::= "$" [0-9]

function     ::= funcname "(" word ")"

listfunction ::= listfuncname "(" word ")"

Переменные

Парсер выражений предоставляет ряд переменных в форме %{HTTP_HOST}. Обратите внимание, что значение переменной может зависеть от фазы обработки запроса, в которой оно оценивается. Например, выражение, используемое в директиве <If >, оценивается до выполнения аутентификации. Поэтому %{REMOTE_USER} в этом случае не будет установлено.

Следующие переменные предоставляют значения указанных HTTP-заголовков запроса. Значения других заголовков можно получить с помощью функции req функции. Использование этих переменных может привести к добавлению имени заголовка в заголовок Vary HTTP-ответа, за исключением случаев, специально отмеченных для директивы, принимающей выражение. Функцию req_novary функции можно использовать для обхода этого поведения.

Имя
HTTP_ACCEPT
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_REFERER
HTTP_USER_AGENT

Другие переменные, связанные с запросом

Имя Описание
REQUEST_METHOD HTTP-метод входящего запроса (например, GET)
REQUEST_SCHEME Схема части URI запроса
REQUEST_URI Часть пути URI запроса
DOCUMENT_URI То же, что и REQUEST_URI
REQUEST_FILENAME Полный локальный путь к файлу или скрипту, соответствующему запросу, если это уже определено сервером во время обращения к REQUEST_FILENAME. В противном случае, например, в контексте виртуального хоста, то же значение, что и REQUEST_URI
SCRIPT_FILENAME То же, что и REQUEST_FILENAME
LAST_MODIFIED Дата и время последнего изменения файла в формате 20101231235959, если это уже определено сервером во время обращения к LAST_MODIFIED
SCRIPT_USER Имя пользователя владельца скрипта.
SCRIPT_GROUP Имя группы группы скрипта.
PATH_INFO Информация о конечном пути, см. AcceptPathInfo
QUERY_STRING Строка запроса текущего запроса
IS_SUBREQ "true", если текущий запрос является подзапросом, "false" в противном случае
THE_REQUEST Полная строка запроса (например, "GET /index.html HTTP/1.1")
REMOTE_ADDR IP-адрес удаленного хоста
REMOTE_PORT Порт удаленного хоста (2.4.26 и более поздние версии)
REMOTE_HOST Имя хоста удаленного хоста
REMOTE_USER Имя аутентифицированного пользователя, если таковой имеется (не доступно во время <If>)
REMOTE_IDENT Имя пользователя, установленное mod_ident
SERVER_NAME ServerName текущего виртуального хоста
SERVER_PORT Порт сервера текущего виртуального хоста, см. ServerName
SERVER_ADMIN ServerAdmin текущего виртуального хоста
SERVER_PROTOCOL Протокол, используемый запросом
DOCUMENT_ROOT DocumentRoot текущего виртуального хоста
AUTH_TYPE Настроенный AuthType (например, "basic")
CONTENT_TYPE Тип содержимого ответа (недоступно во время <If>)
HANDLER Имя обработчика, создающего ответ
HTTP2 "on", если запрос использует http/2, "off" в противном случае
HTTPS "on", если запрос использует https, "off" в противном случае
IPV6 "on", если соединение использует IPv6, "off" в противном случае
REQUEST_STATUS Код HTTP-ошибки запроса (недоступно во время <If>)
REQUEST_LOG_ID Идентификатор журнала ошибок запроса (см. ErrorLogFormat)
CONN_LOG_ID Идентификатор журнала ошибок подключения (см. ErrorLogFormat)
CONN_REMOTE_ADDR IP-адрес узла-партнера соединения (см. модуль mod_remoteip)
CONTEXT_PREFIX
CONTEXT_DOCUMENT_ROOT

Разные переменные

Имя Описание
TIME_YEAR Текущий год (например, 2010)
TIME_MON Текущий месяц (01, ..., 12)
TIME_DAY Текущее число месяца (01, ...)
TIME_HOUR Часы текущего времени (00, ..., 23)
TIME_MIN Минуты текущего времени
TIME_SEC Секунды текущего времени
TIME_WDAY День недели (начиная с 0 для воскресенья)
TIME Дата и время в формате 20101231235959
SERVER_SOFTWARE Строка версии сервера
API_VERSION Дата версии API (магическое число модуля)

Некоторые модули регистрируют дополнительные переменные, см., например, mod_ssl.

Бинарные операторы

За исключением некоторых встроенных операторов сравнения, бинарные операторы имеют вид «-[a-zA-Z][a-zA-Z0-9_]+», т. е. дефис и как минимум два символа. Имя не чувствительно к регистру. Модули могут регистрировать дополнительные бинарные операторы.

Операторы сравнения

Имя Альтернатива Описание
== = Равенство строк
!= Неравенство строк
< Строка меньше
<= Строка меньше или равна
> Строка больше
>= Строка больше или равна
=~ Строка соответствует регулярному выражению
!~ Строка не соответствует регулярному выражению
-eq eq Равенство целых чисел
-ne ne Неравенство целых чисел
-lt lt Целое число меньше
-le le Целое число меньше или равно
-gt gt Целое число больше
-ge ge Целое число больше или равно

Другие бинарные операторы

Имя Описание
-ipmatch IP-адрес соответствует адресу/маске сети
-strmatch Левая строка соответствует шаблону, заданному правой строкой (содержащей подстановочные знаки *, ?, [])
-strcmatch То же, что и -strmatch, но без учета регистра
-fnmatch То же, что и -strmatch, но слеши не соответствуют подстановочным знакам

Унарные операторы

Унарные операторы принимают один аргумент и имеют вид "-[a-zA-Z]", т. е. дефис и один символ. Имя чувствительно к регистру. Модули могут регистрировать дополнительные унарные операторы.

Имя Описание Ограничено
-d Аргумент рассматривается как имя файла. Истинно, если файл существует и является каталогом да
-e Аргумент рассматривается как имя файла. Истинно, если файл (или каталог или специальный файл) существует да
-f Аргумент рассматривается как имя файла. Истинно, если файл существует и является обычным файлом да
-s Аргумент рассматривается как имя файла. Истинно, если файл существует и не пуст да
-L Аргумент рассматривается как имя файла. Истинно, если файл существует и является символьным ссылкой да
-h Истинно, если строка является допустимым файлом, доступным через все текущие конфигурации управления доступом сервера для этого пути. Для проверки используется внутренний подзапрос, поэтому используйте его с осторожностью — это может повлиять на производительность сервера! да
-F Истинно, если строка является допустимым файлом, доступным через все текущие конфигурации управления доступом сервера для этого пути. Для проверки используется внутренний подзапрос, поэтому используйте его с осторожностью — это может повлиять на производительность сервера!
-U Истинно, если строка является допустимым URL-адресом, доступным через все текущие конфигурации управления доступом сервера для этого пути. Для проверки используется внутренний подзапрос, поэтому используйте его с осторожностью — это может повлиять на производительность сервера!
-A Псевдоним для -U
-n Истинно, если строка не пуста
-z Истинно, если строка пуста
-T Ложно, если строка пуста, "0", "off", "false", или "no" (регистр не учитывается). Иначе истинно.
-R То же, что и "%{REMOTE_ADDR} -ipmatch ...", но более эффективно

Операторы, помеченные как «ограниченные», недоступны в некоторых модулях, таких как mod_include.

Функции

Обычные функции со строковым значением принимают одну строку в качестве аргумента и возвращают строку. Имена функций не чувствительны к регистру. Модули могут регистрировать дополнительные функции.

Имя Описание Особые примечания
req, http Получение заголовка HTTP-запроса; имена заголовков могут быть добавлены в заголовок Vary, см. ниже
req_novary То же, что и req, но имена заголовков не будут добавлены в заголовок Vary
resp Получение заголовка HTTP-ответа (большинство заголовков ответа еще не будут установлены во время <If>)
reqenv Поиск переменной окружения запроса (как сокращение, v также может использоваться для доступа к переменным). порядок
osenv Поиск переменной окружения операционной системы
note Поиск примечания запроса порядок
env Возвращает первое совпадение note, reqenv, osenv порядок
tolower Преобразование строки в нижний регистр
toupper Преобразование строки в верхний регистр
escape Экранирование специальных символов в кодировке %hex
unescape Разворачивание строки, закодированной в %hex, оставляя закодированные косые черты в покое; возвращает пустую строку, если найден %00
base64 Кодирование строки с использованием кодировки base64
unbase64 Декодирование строки, закодированной в base64, возвращает усеченную строку, если найден 0x00
md5 Хеширование строки с использованием MD5, а затем кодирование хэша с использованием шестнадцатеричной кодировки
sha1 Хеширование строки с использованием SHA1, а затем кодирование хэша с использованием шестнадцатеричной кодировки
file Чтение содержимого из файла (включая символы конца строки, если они есть) ограничено
filemod Возвращает последнее время изменения файла (или 0, если файл не существует или не является обычным файлом) ограничено
filesize Возвращает размер файла (или 0, если файл не существует или не является обычным файлом) ограничено

Функции, помеченные как «ограниченные» в последнем столбце, недоступны в некоторых модулях, таких как mod_include.

Функции, помеченные как «порядок» в последнем столбце, требуют некоторого внимания к порядку различных компонентов сервера, особенно когда функция используется в директиве <If>, которая оценивается относительно рано.

Порядок переменных окружения

При поиске переменных окружения внутри условия <If>, важно учитывать, как чрезвычайно рано происходит это разрешение в процессе обработки запроса. В качестве руководства, любая директива, определенная за пределами контекста виртуального хоста (директория, расположение, htaccess), вероятно, еще не успела выполниться. SetEnvIf в области виртуального хоста — это одна из директив, которая выполняется до этого разрешения

Когда reqenv используется вне <If>, разрешение, как правило, происходит позже, но точное время зависит от директивы, внутри которой используется выражение.

Когда используются функции req или http , имя заголовка автоматически добавляется в заголовок Vary HTTP-ответа, за исключением случаев, когда для директивы, принимающей выражение, указано иное. Функция req_novary может использоваться для предотвращения добавления имен в заголовок Vary.

Помимо функций со строковым значением, есть также функции со списком, которые принимают одну строку в качестве аргумента и возвращают список слов, т. е. список строк. Список слов можно использовать со специальным оператором -in. Имена функций не чувствительны к регистру. Модули могут регистрировать дополнительные функции.

Встроенных функций со списком значений нет. mod_ssl предоставляет PeerExtList. См. описание SSLRequire для получения подробностей (но PeerExtList также можно использовать вне SSLRequire).

Примеры выражений

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

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
    Redirect permanent "/" "http://www.example.com/"
</If>

# Force text/plain if requesting a file with the query string contains 'forcetext'
<If "%{QUERY_STRING} =~ /forcetext/">
    ForceType text/plain
</If>

# Only allow access to this content during business hours
<Directory "/foo/bar/business">
    Require expr %{TIME_HOUR} -gt 9 && %{TIME_HOUR} -lt 17
</Directory>

# Check a HTTP header for a list of values
<If "%{HTTP:X-example-header} in { 'foo', 'bar', 'baz' }">
    Header set matched true
</If>

# Check an environment variable for a regular expression, negated.
<If "! reqenv('REDIRECT_FOO') =~ /bar/">
    Header set matched true
</If>

# Check result of URI mapping by running in Directory context with -f
<Directory "/var/www">
    AddEncoding x-gzip gz
<If "-f '%{REQUEST_FILENAME}.unzipme' && ! %{HTTP:Accept-Encoding} =~ /gzip/">
      SetOutputFilter INFLATE
</If>
</Directory>

# Check against the client IP
<If "-R '192.168.1.0/24'">
    Header set matched true
</If>

# Function example in boolean context
<If "md5('foo') == 'acbd18db4cc2f85cedef654fccc4a4d8'">
  Header set checksum-matched true
</If>

# Function example in string context
Header set foo-checksum "expr=%{md5:foo}"

# This delays the evaluation of the condition clause compared to <If>
Header always set CustomHeader my-value "expr=%{REQUEST_URI} =~ m#^/special_path\.php$#"

# Conditional logging
CustomLog logs/access-errors.log common "expr=%{REQUEST_STATUS} >= 400"
CustomLog logs/access-errors-specific.log common "expr=%{REQUEST_STATUS} -in {'405','410'}"

Другие

Имя Альтернатива Описание
-in in строка, содержащаяся в списке слов
/regexp/ m#regexp# Регулярное выражение (вторая форма позволяет использовать разные разделители, отличные от /)
/regexp/i m#regexp#i Регулярное выражение без учета регистра
$0 ... $9
Обратные ссылки регулярного выражения

Обратные ссылки регулярного выражения

Строки $0 ... $9 позволяют ссылаться на группы захвата из ранее выполненных, успешно сопоставленных регулярных выражений. Обычно они могут использоваться только в том же выражении, что и сопоставляющее регулярное выражение, но некоторые модули позволяют использовать их особым образом.

Сравнение с SSLRequire

Синтаксис ap_expr в основном является супермножеством синтаксиса устаревшей директивы SSLRequire. Различия описаны в документации SSLRequire.

История версий

Функция req_novary функция доступна для версий 2.4.4 и более поздних.

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/expr.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API