Выражения в 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