Пункт 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
или любую другую комбинацию.