Spec-Zone.ru › Apache HTTP Server

Переменные среды в Apache

Существует два вида переменных среды, которые влияют на сервер Apache HTTP.

Во-первых, это переменные среды, управляемые основной операционной системой. Они устанавливаются до запуска сервера. Они могут использоваться в расширениях конфигурационных файлов и, по желанию, передаваться скриптам CGI и SSI с помощью директивы PassEnv.

Во-вторых, сервер Apache HTTP предоставляет механизм для хранения информации в именованных переменных, которые также называются переменными среды. Эта информация может использоваться для управления различными операциями, такими как ведение журнала или контроль доступа. Переменные также используются как механизм связи с внешними программами, такими как скрипты CGI. В этом документе рассматриваются различные способы управления и использования этих переменных.

Хотя эти переменные называются переменными среды, они не являются теми же переменными среды, что и переменные среды, управляемые основной операционной системой. Вместо этого эти переменные хранятся и обрабатываются в внутренней структуре Apache. Они становятся фактическими переменными среды операционной системы только при передаче скриптам CGI и скриптам Server Side Include. Если вы хотите изменить среду операционной системы, в которой работает сам сервер, вы должны использовать стандартные механизмы управления средой, предоставляемые оболочкой вашей операционной системы.

Установка переменных среды

Связанные модули Связанные директивы
  • mod_cache
  • mod_env
  • mod_rewrite
  • mod_setenvif
  • mod_unique_id
  • BrowserMatch
  • BrowserMatchNoCase
  • PassEnv
  • RewriteRule
  • SetEnv
  • SetEnvIf
  • SetEnvIfNoCase
  • UnsetEnv

Основные операции с окружением

Самый простой способ установить переменную среды в Apache — использовать условную директиву SetEnv. Переменные также могут быть переданы из среды оболочки, которая запустила сервер, с помощью директивы PassEnv.

Условные настройки на запрос

Для большей гибкости директивы, предоставляемые mod_setenvif, позволяют устанавливать переменные среды на основе отдельных запросов, при условии определенных характеристик конкретных запросов. Например, переменная может устанавливаться только тогда, когда определенный браузер (User-Agent) делает запрос, или только когда найден определенный заголовок Referer [sic]. Еще большую гибкость предоставляет mod_rewrite с RewriteRule, которая использует опцию [E=...] для установки переменных среды.

Уникальные идентификаторы

Наконец, mod_unique_id устанавливает переменную среды UNIQUE_ID для каждого запроса со значением, гарантированно уникальным для «всех» запросов при очень специфических условиях.

Стандартные переменные CGI

В дополнение ко всем переменным среды, установленным в конфигурации Apache и переданным из оболочки, скриптам CGI и страницам SSI предоставляется набор переменных среды, содержащих метаинформацию о запросе, как требуется спецификацией CGI.

Некоторые замечания

  • Невозможно переопределить или изменить стандартные переменные CGI, используя директивы управления средой.
  • Когда suexec используется для запуска скриптов CGI, среда будет очищена до набора безопасных переменных перед запуском скриптов CGI. Список безопасных переменных определяется во время компиляции в suexec.c.
  • Из соображений портативности, имена переменных среды могут содержать только буквы, цифры и символ подчеркивания. Кроме того, первый символ не может быть цифрой. Символы, не соответствующие этому ограничению, будут заменены подчеркиванием при передаче скриптам CGI и страницам SSI.
  • Особый случай — HTTP-заголовки, которые передаются скриптам CGI и т. п. через переменные среды (см. ниже). Они преобразуются в верхний регистр, и только дефисы заменяются подчеркиваниями; если заголовок содержит другие (недопустимые) символы, весь заголовок молча отбрасывается. См. ниже для обходного решения.
  • Директива SetEnv выполняется поздно во время обработки запроса, что означает, что директивы, такие как SetEnvIf и RewriteCond, не увидят переменные, установленные с ней.
  • Когда сервер ищет путь с помощью внутреннего подзапроса, такого как поиск DirectoryIndex или создание списка каталога с mod_autoindex, переменные среды, установленные на основе отдельных запросов, не наследуются в подзапросе. Кроме того, директивы SetEnvIf не оцениваются отдельно в подзапросе из-за фаз API, в которых mod_setenvif выполняет действия.

Использование переменных среды

Связанные модули Связанные директивы
  • mod_authz_host
  • mod_cgi
  • mod_ext_filter
  • mod_headers
  • mod_include
  • mod_log_config
  • mod_rewrite
  • Require
  • CustomLog
  • Allow
  • Deny
  • ExtFilterDefine
  • Header
  • LogFormat
  • RewriteCond
  • RewriteRule

Скрипты CGI

Одно из основных применений переменных среды — передача информации скриптам CGI. Как обсуждалось выше, среда, передаваемая скриптам CGI, включает стандартную метаинформацию о запросе в дополнение к переменным, установленным в конфигурации Apache. Для более подробной информации см. руководство по CGI.

Страницы SSI

Обрабатываемые сервером (SSI) документы, обработанные фильтром mod_include's INCLUDES, могут выводить переменные среды, используя элемент echo, и могут использовать переменные среды в элементах управления потоком, чтобы сделать части страницы условными в зависимости от характеристик запроса. Apache также предоставляет страницам SSI стандартные переменные CGI, как описано выше. Для более подробной информации см. руководство по SSI.

Контроль доступа

Доступ к серверу может контролироваться на основе переменных среды с помощью директив Require env и Require not env. В сочетании с SetEnvIf, это позволяет гибко управлять доступом к серверу на основе характеристик клиента. Например, вы можете использовать эти директивы для запрета доступа к определенному браузеру (User-Agent).

Условное ведение журнала

Переменные среды могут регистрироваться в журнале доступа с помощью опции LogFormat %e. Кроме того, решение о том, регистрировать запросы или нет, может приниматься на основе состояния переменных среды с использованием условной формы директивы CustomLog. В сочетании с SetEnvIf это позволяет гибко контролировать, какие запросы регистрируются. Например, вы можете выбрать не регистрировать запросы для имен файлов, оканчивающихся на gif, или вы можете выбрать регистрировать запросы только от клиентов, находящихся вне вашей подсети.

Условные заголовки ответа

Директива Header может использовать наличие или отсутствие переменной среды, чтобы определить, будет ли определенный HTTP-заголовок размещен в ответе клиенту. Это позволяет, например, отправлять определенный заголовок ответа только в том случае, если соответствующий заголовок получен в запросе от клиента.

Активация внешнего фильтра

Внешние фильтры, настроенные с помощью mod_ext_filter с помощью директивы ExtFilterDefine, могут быть активированы в зависимости от переменной среды с использованием опций disableenv= и enableenv=.

Перенаправление URL

Форма %{ENV:variable} в RewriteCond позволяет движку перенаправления mod_rewrite принимать решения, основанные на переменных среды. Обратите внимание, что переменные, доступные в mod_rewrite без префикса ENV:, на самом деле не являются переменными среды. Скорее, это переменные, специфичные для mod_rewrite, к которым нельзя получить доступ из других модулей.

Переменные среды специального назначения

Проблемы с межплатформенной совместимостью привели к появлению механизмов модификации поведения Apache при работе с определенными клиентами. Для максимальной гибкости эти механизмы вызываются путем определения переменных среды, обычно с помощью BrowserMatch, хотя можно также использовать SetEnv и PassEnv.

downgrade-1.0

Это заставляет запрос обрабатываться как запрос HTTP/1.0, даже если он был в более позднем диалекте.

force-gzip

Если активирован фильтр DEFLATE, эта переменная среды проигнорирует настройку accept-encoding вашего браузера и не условно отправит сжатый вывод.

force-no-vary

Это приводит к удалению всех полей Vary из заголовка ответа перед его отправкой обратно клиенту. Некоторые клиенты неправильно интерпретируют это поле; установка этой переменной может решить эту проблему. Установка этой переменной также подразумевает force-response-1.0.

force-response-1.0

Это заставляет клиентов, делающих запрос HTTP/1.0, получить ответ HTTP/1.0. Первоначально это было реализовано в результате проблемы с прокси-серверами AOL. Некоторые клиенты HTTP/1.0 могут неправильно вести себя, когда им предоставляется ответ HTTP/1.1, и это может использоваться для работы с ними.

gzip-only-text/html

При установке в значение «1» эта переменная отключает фильтр вывода DEFLATE, предоставляемый mod_deflate, для типов контента, отличных от text/html. Если вы предпочитаете использовать статически сжатые файлы, mod_negotiation также оценивает переменную (не только для gzip, но и для всех кодировок, отличных от «identity»).

no-gzip

При установке, фильтр DEFLATE модуля mod_deflate будет отключен, и mod_negotiation откажется от доставки закодированных ресурсов.

no-cache

Доступно в версиях 2.2.12 и более поздних

При установке mod_cache не будет сохраняться в противном случае кэшируемый ответ. Эта переменная окружения не влияет на то, будет ли ответ, уже имеющийся в кэше, обслуживаться для текущего запроса.

nokeepalive

Это отключает KeepAlive при установке.

prefer-language

Это влияет на поведение mod_negotiation. Если он содержит тег языка (такой как en, ja или x-klingon), mod_negotiation пытается доставить вариант с этим языком. Если такого варианта нет, применяется обычный процесс переговоров.

redirect-carefully

Это заставляет сервер быть более осторожным при отправке перенаправления клиенту. Это обычно используется, когда у клиента известна проблема с обработкой перенаправлений. Это изначально было реализовано в результате проблемы с программным обеспечением Microsoft WebFolders, у которого есть проблема с обработкой перенаправлений на ресурсы каталогов через методы DAV.

suppress-error-charset

Доступно в версиях после 2.0.54

Когда Apache отправляет перенаправление в ответ на запрос клиента, ответ включает некоторый фактический текст, который должен отображаться в случае, если клиент не может (или не хочет) автоматически следовать перенаправлению. Apache обычно маркирует этот текст в соответствии с используемой кодировкой символов, которая является ISO-8859-1.

Однако, если перенаправление ведёт на страницу, которая использует другую кодировку символов, некоторые неисправные версии браузеров попытаются использовать кодировку символов из текста перенаправления, а не фактической страницы. Это может привести, например, к некорректному отображению греческого текста.

Указание этой переменной окружения заставляет Apache опустить кодировку символов для текста перенаправления, и эти неисправные браузеры затем корректно будут использовать кодировку символов целевой страницы.

Примечание по безопасности

Отправка страниц ошибок без указанной кодировки символов может позволить атаку межсайтовой подстановки кода для существующих браузеров (MSIE), которые не следуют спецификации HTTP/1.1 и пытаются «угадать» кодировку символов по содержимому. Такие браузеры легко обмануть, заставив их использовать кодировку символов UTF-7, и содержимое UTF-7 из входных данных (например, URI запроса) не будет экранировано обычными механизмами экранирования, разработанными для предотвращения атак межсайтовой подстановки кода.

force-proxy-request-1.0, proxy-nokeepalive, proxy-sendchunked, proxy-sendcl, proxy-chain-auth, proxy-interim-response, proxy-initial-not-pooled

Эти директивы изменяют поведение протокола mod_proxy. Подробности см. в документации mod_proxy и mod_proxy_http.

Примеры

Передача некорректных заголовков CGI-скриптам

Начиная с версии 2.4, Apache более строго относится к тому, как HTTP-заголовки преобразуются в переменные среды в mod_cgi и других модулях: Раньше любые недопустимые символы в именах заголовков просто переводились в символы подчеркивания. Это позволяло проводить потенциальные атаки межсайтовой подстановки кода через инъекцию заголовков (см. Необычные ошибки веб-приложений, слайд 19/20).

Если вам нужно поддерживать клиента, который отправляет некорректные заголовки и который не может быть исправлен, простое решение, включающее mod_setenvif и mod_headers, позволяет вам по-прежнему принимать эти заголовки:

#
# The following works around a client sending a broken Accept_Encoding
# header.
#
SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1
RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding

Изменение поведения протокола с некорректно работающими клиентами

В более ранних версиях рекомендовалось включать следующие строки в httpd.conf для решения известных проблем с клиентами. Поскольку затронутые клиенты больше не встречаются в дикой природе, эта настройка, вероятно, больше не нужна.

#
# The following directives modify normal HTTP response behavior.
# The first directive disables keepalive for Netscape 2.x and browsers that
# spoof it. There are known problems with these browser implementations.
# The second directive is for Microsoft Internet Explorer 4.0b2
# which has a broken HTTP/1.1 implementation and does not properly
# support keepalive when it is used on 301 or 302 (redirect) responses.
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0

#
# The following directive disables HTTP/1.1 responses to browsers which
# are in violation of the HTTP/1.0 spec by not being able to understand a
# basic 1.1 response.
#
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

Не регистрировать запросы изображений в журнале доступа

Этот пример не позволяет отображаться запросам изображений в журнале доступа. Его можно легко изменить, чтобы предотвратить протоколирование определённых каталогов или запросов, поступающих с определённых хостов.

SetEnvIf Request_URI \.gif image-request
SetEnvIf Request_URI \.jpg image-request
SetEnvIf Request_URI \.png image-request
CustomLog "logs/access_log" common env=!image-request

Предотвращение «кражи изображений»

Этот пример показывает, как предотвратить использование изображениями на вашем сервере в качестве встроенных изображений на страницах других пользователей, не находящихся на вашем сервере. Эта конфигурация не рекомендуется, но может работать в ограниченных случаях. Мы предполагаем, что все ваши изображения находятся в каталоге /web/images.

SetEnvIf Referer "^http://www\.example\.com/" local_referal
# Allow browsers that do not send Referer info
SetEnvIf Referer "^$" local_referal
<Directory "/web/images">
    Require env local_referal
</Directory>

Дополнительную информацию об этой технике можно найти в руководстве "Предотвращение использования ваших изображений на других сайтах" на ServerWatch.

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

Spec-Zone.ru

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