Пункт 193. Модуль Apache mod_setenvif
Модуль 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 |
| Переопределить: | Информация о файле |
| Положение дел: | База |
| Модуль: | mod_setenvif |
Это BrowserMatch особый случай директивы
SetEnvIf , которая устанавливает переменные среды в зависимости от
User-Agent заголовка HTTP-запроса. Следующие две строки имеют одинаковый эффект:
Робот BrowserMatch is_a_robot
Робот SetEnvIf User-Agent is_a_robot
Некоторые дополнительные примеры:
BrowserMatch ^Mozilla формирует jpeg=yes browser=netscape
BrowserMatch "^Mozilla/[2-3]" таблицы agifframes javascript
BrowserMatch MSIE !javascript
Директива BrowserMatchNoCase
| Описание: | Устанавливает переменные среды в зависимости от User-Agent без учета регистра. |
| Синтаксис: | BrowserMatchNoCase regex [!]env-variable[=value]
[[!]env-variable[=value]] ... |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределить: | Информация о файле |
| Положение дел: | База |
| Модуль: | mod_setenvif |
Директива BrowserMatchNoCase семантически идентична директиве BrowserMatch . Однако он обеспечивает сопоставление без учета регистра. Например:
BrowserMatchNoCase платформа Mac = Macintosh
BrowserMatchNoCase win платформа = windows
Директивы BrowserMatch и
BrowserMatchNoCase являются частными случаями директив SetEnvIf и SetEnvIfNoCase
. Следующие две строки имеют одинаковый эффект:
BrowserMatchNoCase Робот is_a_robot
SetEnvIfNoCase User-Agent Робот is_a_robot
Директива SetEnvIf
| Описание: | Устанавливает переменные среды на основе атрибутов запроса
|
| Синтаксис: | SetEnvIf attribute
regex [!]env-variable[=value]
[[!]env-variable[=value]] ... |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределить: | Информация о файле |
| Положение дел: | База |
| Модуль: | 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] директивами, доступны для тестирования таким образом. «Ранее» означает, что они были определены в более широкой области (например, на уровне сервера) или ранее в области действия текущей директивы. Переменные среды будут учитываться только в том случае, если не было совпадений среди характеристик запроса и для атрибута не использовалось регулярное выражение .
Второй аргумент ( регулярное выражение ) является регулярным выражением . Если регулярное выражение
совпадает с атрибутом , то оцениваются остальные аргументы.
Остальные аргументы задают имена переменных, которые необходимо установить, и, возможно, значения, в которые они должны быть установлены. Они принимают форму
-
varname , или
-
!varname , или
-
varname=value
В первой форме значение будет установлено на «1». Второй удалит данную переменную, если она уже определена, а третий установит для переменной буквальное значение, заданное
. Начиная с версии 2.0.51, Apache httpd распознает вхождения .. внутри
значения и заменяет их заключенными в скобки подвыражениями регулярного выражения . обеспечивает доступ ко всей строке, соответствующей этому шаблону. value $1 $9 $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 "\.(.*)$" РАСШИРЕНИЕ=$1
SetEnvIf ^TS ^[az] HAVE_TS
Первые три задают переменную окружения,
object_is_image если запрашивался файл изображения, а четвертый устанавливает intra_site_referral , находится ли ссылающаяся страница где-то на
www.mydomain.example.com веб-сайте.
В последнем примере будет установлена переменная среды,
HAVE_TS если запрос содержит какие-либо заголовки, начинающиеся с «TS», значения которых начинаются с любого символа в наборе [az].
Смотрите также
- Переменные среды в HTTP-сервере Apache для дополнительных примеров.
Директива SetEnvIfExpr
| Описание: | Задает переменные среды на основе выражения ap_expr |
| Синтаксис: | SetEnvIfExpr expr
[!]env-variable[=value]
[[!]env-variable[=value]] ... |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределить: | Информация о файле |
| Положение дел: | База |
| Модуль: | mod_setenvif |
Директива SetEnvIfExpr определяет переменные среды на основе файла <If>
ap_expr . Эти выражения будут оцениваться во время выполнения и применяться к env-variable так же, как и SetEnvIf .
SetEnvIfExpr "tolower(req('X-Sendfile')) == 'd:\images\very_big.iso')" iso_delivered
Это будет устанавливать переменную среды 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
Смотрите также
- Выражения в HTTP-сервере Apache, полный справочник и другие примеры.
-
<If> можно использовать для достижения аналогичных результатов.
-
mod_filter
Директива SetEnvIfNoCase
| Описание: | Устанавливает переменные среды на основе атрибутов запроса без учета регистра |
| Синтаксис: | SetEnvIfNoCase attribute regex
[!]env-variable[=value]
[[!]env-variable[=value]] ... |
| Контекст: | конфигурация сервера, виртуальный хост, каталог, .htaccess |
| Переопределить: | Информация о файле |
| Положение дел: | База |
| Модуль: | mod_setenvif |
SetEnvIfNoCase Семантически идентична директиве и SetEnvIf отличается только тем, что сопоставление с регулярным выражением выполняется без учета регистра. Например:
Пример узла SetEnvIfNoCase\.Org site=example
Это приведет к тому, что для site переменной среды будет установлено значение " example ", если поле заголовка HTTP-запроса Host: было включено и содержало
Example.Org , example.org или любую другую комбинацию.