Apache. Документация на русском


Разделы:   1      2      3    4    5    6    7    8    9    10    11    12    13    14    15    16  

Раздел 2. Использование HTTP-сервера Apache

Пункты:   6    7    8    9    10    11    12    13    14    15    16    17    18    19      20      21    22    23    24    25    26  

 <         > 
  RU            EN  

Пункт 20. Переменные окружения в Apache

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

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

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

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

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

Основные манипуляции с окружающей средой

Самый простой способ установить переменную среды в 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 выполняют действия.

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

CGI-скрипты

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

Страницы SSI

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

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

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

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

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

Заголовки условного ответа

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

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

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

Перезапись URL

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

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

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

даунгрейд-1.0

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

принудительное сжатие

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

форс-не-вариант

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

сила-реакция-1.0

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

gzip-только-текст/html

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

без gzip

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

без кэша

Доступно в версиях 2.2.12 и выше

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

неактивен

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

предпочтительный язык

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

перенаправить-осторожно

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

подавить-ошибка-кодировка

Доступно в версиях после 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-pool

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

Примеры

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

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

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

 #
# Следующее работает с клиентом, отправляющим неверный Accept_Encoding
# заголовок.
#
SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1
RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding 

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

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

 #
# Следующие директивы изменяют обычное поведение ответа HTTP.
# Первая директива отключает поддержку активности для Netscape 2.x и браузеров, которые
# обманывать. Известны проблемы с этими реализациями браузера.
# Вторая директива для Microsoft Internet Explorer 4.0b2
# который имеет сломанную реализацию HTTP/1.1 и неправильно
# поддержка поддержки активности, когда она используется в ответах 301 или 302 (перенаправление).
#
BrowserMatch "Mozilla/2"
BrowserMatch "MSIE 4\.0b2;" nokeepalive даунгрейд-1.0 форс-реакция-1.0
#
# Следующая директива отключает ответы HTTP/1.1 для браузеров, которые
# нарушают спецификацию HTTP/1.0, поскольку не могут понять
# базовый ответ 1.1.
#
BrowserMatch "RealPlayer 4\.0" принудительный ответ-1.0
BrowserMatch "Java/1\.0" принудительный ответ-1.0
BrowserMatch "JDK/1\.0" принудительный ответ-1.0 

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

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

 SetEnvIf Request_URI \.gif запрос изображения
SetEnvIf Request_URI \.jpg изображение-запрос
SetEnvIf Request_URI \.png изображение-запрос
Журналы CustomLog/access_log общий env=!image-request 

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

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

 SetEnvIf Referer "^http://www\.example\.com/" local_referal
# Разрешить браузеры, которые не отправляют информацию о реферере
SetEnvIf Referer "^$" local_referal
<Каталог "/web/images">
 Требовать env local_referal
</Каталог> 

Для получения дополнительной информации об этом методе см. руководство «Сохранение ваших изображений от украшения других сайтов» на ServerWatch.



 <         > 

Пункты:   6    7    8    9    10    11    12    13    14    15    16    17    18    19      20      21    22    23    24    25    26  

Рейтинг@Mail.ru