Модуль Apache mod_setenvif
| Описание: | Позволяет задавать переменные окружения на основе характеристик запроса |
|---|---|
| Статус: | Базовый |
| Идентификатор модуля: | setenvif_module |
| Исходный файл: | mod_setenvif.c |
Краткое описание
Модуль mod_setenvif позволяет задавать внутренние переменные окружения в зависимости от того, соответствуют ли различные аспекты запроса указанным вами регулярным выражениям. Эти переменные окружения могут использоваться другими компонентами сервера для принятия решений о необходимых действиях, а также становятся доступными CGI-скриптам и страницам SSI.
Директивы обрабатываются в том порядке, в котором они указаны в файлах конфигурации. Это позволяет использовать более сложные последовательности, например следующий пример, который задаёт netscape, если браузер — Mozilla, но не MSIE.
BrowserMatch ^Mozilla netscape BrowserMatch MSIE !netscape
Когда сервер ищет путь с помощью внутреннего подзапроса, например при поиске DirectoryIndex или создании списка каталогов с помощью mod_autoindex, переменные окружения, относящиеся к запросу, не наследуются подзапросом. Кроме того, директивы SetEnvIf не вычисляются отдельно в подзапросе из-за фаз API, в которых mod_setenvif выполняет свои действия.
Директива BrowserMatch
| Описание: | Устанавливает переменные окружения в зависимости от HTTP User-Agent |
|---|---|
| Синтаксис: | BrowserMatch regex [!]env-variable[=value] [[!]env-variable[=value]] ... |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Базовый |
| Модуль: | mod_setenvif |
Директива BrowserMatch — это частный случай директивы SetEnvIf, которая устанавливает переменные окружения в зависимости от заголовка HTTP-запроса User-Agent. Следующие две строки имеют одинаковый эффект:
BrowserMatch Robot is_a_robot SetEnvIf User-Agent Robot is_a_robot
Некоторые дополнительные примеры:
BrowserMatch ^Mozilla forms jpeg=yes browser=netscape BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript BrowserMatch MSIE !javascript
Директива BrowserMatchNoCase
| Описание: | Устанавливает переменные окружения в зависимости от User-Agent без учёта регистра |
|---|---|
| Синтаксис: | BrowserMatchNoCase regex [!]env-variable[=value] [[!]env-variable[=value]] ... |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Базовый |
| Модуль: | mod_setenvif |
Директива BrowserMatchNoCase семантически идентична директиве BrowserMatch. Однако она выполняет сопоставление без учёта регистра. Например:
BrowserMatchNoCase mac platform=macintosh BrowserMatchNoCase win platform=windows
Директивы BrowserMatch и BrowserMatchNoCase являются частными случаями директив SetEnvIf и SetEnvIfNoCase. Следующие две строки имеют одинаковый эффект:
BrowserMatchNoCase Robot is_a_robot SetEnvIfNoCase User-Agent Robot is_a_robot
Директива SetEnvIf
| Описание: | Устанавливает переменные окружения на основе атрибутов запроса |
|---|---|
| Синтаксис: | SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ... |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Базовый |
| Модуль: | mod_setenvif |
Директива SetEnvIf определяет переменные окружения на основе атрибутов запроса. Атрибутом, указанным в первом аргументе, может быть один из четырёх вариантов:
- Поле заголовка HTTP-запроса (подробнее см. в RFC2616); например:
Host,User-Agent,RefererиAccept-Language. Для задания набора заголовков запроса можно использовать регулярное выражение. - Один из следующих аспектов запроса:
-
Remote_Host— имя хоста (если доступно) клиента, отправившего запрос -
Remote_Addr— IP-адрес клиента, отправившего запрос -
Server_Addr— IP-адрес сервера, на который был получен запрос (только для версий выше 2.0.43) -
Request_Method— имя используемого метода (GET,POST, и так далее) -
Request_Protocol— имя и версия протокола, с помощью которого был сделан запрос (например, «HTTP/0.9», «HTTP/1.1» и т. д.) -
Request_URI— ресурс, запрошенный в строке HTTP-запроса, то есть обычно часть URL после схемы и имени хоста, без строки запроса. Дополнительные сведения о сопоставлении строки запроса см. в директивеRewriteCondмодуляmod_rewrite.
-
- Имя переменной окружения из списка переменных, связанных с запросом. Это позволяет директивам
SetEnvIfпроверять результат предыдущих сопоставлений. Таким образом можно проверять только те переменные окружения, которые определены более ранними директивамиSetEnvIf[NoCase]. «Более ранними» считаются директивы, определённые в более широкой области (например, на уровне всего сервера) или ранее в области действия текущей директивы. Переменные окружения учитываются, только если соответствия среди характеристик запроса не найдено и для атрибута не использовалось регулярное выражение.
Второй аргумент (regex) — это регулярное выражение. Если regex соответствует атрибуту, обрабатываются остальные аргументы.
Остальные аргументы задают имена переменных, которые нужно установить, и, при необходимости, значения, которые им следует присвоить. Используются следующие формы:
-
varname, или -
!varname, или varname=value
В первом случае переменной будет присвоено значение «1». Во втором случае указанная переменная будет удалена, если она уже определена, а в третьем переменной будет присвоено буквальное значение, указанное в value. Начиная с версии 2.0.51 Apache httpd распознаёт вхождения $1..$9 в value и заменяет их подвыражениями regex, заключёнными в скобки. $0 позволяет получить всю строку, соответствующую этому шаблону.
SetEnvIf Request_URI "\.gif$" object_is_image=gif
SetEnvIf Request_URI "\.jpg$" object_is_image=jpg
SetEnvIf Request_URI "\.xbm$" object_is_image=xbm
SetEnvIf Referer www\.mydomain\.example\.com intra_site_referral
SetEnvIf object_is_image xbm XBIT_PROCESSING=1
SetEnvIf Request_URI "\.(.*)$" EXTENSION=$1
SetEnvIf ^TS ^[a-z] HAVE_TS В первых трёх примерах переменная окружения object_is_image будет установлена, если запрос относится к файлу изображения, а в четвёртом intra_site_referral будет установлена, если ссылающаяся страница находится на веб-сайте www.mydomain.example.com.
В последнем примере переменная окружения HAVE_TS будет установлена, если запрос содержит какие-либо заголовки, начинающиеся с «TS», значения которых начинаются с любого символа из набора [a-z].
См. также
- Переменные окружения в Apache HTTP Server — дополнительные примеры.
Директива SetEnvIfExpr
| Описание: | Устанавливает переменные окружения на основе выражения ap_expr |
|---|---|
| Синтаксис: | SetEnvIfExpr expr [!]env-variable[=value] [[!]env-variable[=value]] ... |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Базовый |
| Модуль: | mod_setenvif |
Директива SetEnvIfExpr определяет переменные окружения на основе выражения. Эти выражения вычисляются во время выполнения, а затем к переменной окружения применяется результат таким же образом, как в SetEnvIf, включая обратные ссылки.
SetEnvIfExpr "tolower(req('X-Sendfile')) == 'd:\images\very_big.iso')" iso_delivered
SetEnvIfExpr "tolower(req('X-Sendfile')) =~ /(.*\.iso$)/" iso-path=$1 Это будет устанавливать переменную окружения iso_delivered каждый раз, когда наше приложение пытается отправить её через X-Sendfile
Более полезный пример — установка переменной rfc1918, если удалённый IP-адрес является частным адресом согласно RFC 1918:
SetEnvIfExpr "-R '10.0.0.0/8' || -R '172.16.0.0/12' || -R '192.168.0.0/16'" rfc1918
См. также
- Выражения в Apache HTTP Server — полное справочное руководство и дополнительные примеры.
-
<If>можно использовать для достижения аналогичных результатов. mod_filter
Директива SetEnvIfNoCase
| Описание: | Устанавливает переменные окружения на основе атрибутов запроса без учёта регистра |
|---|---|
| Синтаксис: | SetEnvIfNoCase attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ... |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределение: | FileInfo |
| Статус: | Базовый |
| Модуль: | mod_setenvif |
Директива SetEnvIfNoCase семантически идентична директиве SetEnvIf и отличается только тем, что сопоставление с регулярным выражением выполняется без учёта регистра. Например:
SetEnvIfNoCase Host Example\.Org site=example
В этом случае переменной окружения site будет присвоено значение «example», если поле заголовка HTTP-запроса Host: присутствует и содержит Example.Org, example.org или любую другую комбинацию.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_setenvif.html