Пункт 23. Фильтры
Этот документ описывает использование фильтров в Apache.
Фильтрация в Apache 2
Цепочка фильтров доступна в Apache 2.0 и более поздних версиях и позволяет приложениям обрабатывать входящие и исходящие данные очень гибким и настраиваемым образом, независимо от того, откуда поступают данные. Мы можем предварительно обрабатывать входящие данные и постобрабатывать исходящие данные по желанию. Это в основном не зависит от традиционных фаз обработки запросов.
Некоторые примеры фильтрации в стандартном дистрибутиве Apache:
-
mod_include
, реализует включения на стороне сервера.
-
mod_ssl
, реализует SSL-шифрование (https).
-
mod_deflate
, реализует сжатие/распаковку на лету.
-
mod_charset_lite
, перекодирует между различными наборами символов.
-
mod_ext_filter
, запускает внешнюю программу в качестве фильтра.
Apache также использует ряд внутренних фильтров для выполнения таких функций, как фрагментация и обработка диапазона байтов.
Более широкий спектр приложений реализуется сторонними фильтрующими модулями, доступными на сайте modules.apache.org и в других местах. Вот некоторые из них:
- Обработка и перезапись HTML и XML
- Преобразования XSLT и XIncludes
- Поддержка пространства имен XML
- Обработка загрузки файлов и декодирование HTML-форм
- Обработка изображений
- Защита уязвимых приложений, таких как PHP-скрипты
- Редактирование поиска и замены текста
Умная фильтрация
mod_filter
, включенный в Apache 2.1 и более поздние версии, позволяет динамически настраивать цепочку фильтров во время выполнения. Так, например, вы можете настроить прокси-сервер для перезаписи HTML с фильтром HTML и изображений JPEG с совершенно отдельным фильтром, несмотря на то, что прокси-сервер не имеет предварительной информации о том, что отправит исходный сервер. Это работает с использованием жгута фильтров, который отправляет различным поставщикам в соответствии с фактическим содержимым во время выполнения. Любой фильтр может быть либо вставлен непосредственно в цепочку и выполняться безоговорочно, либо использоваться в качестве поставщика и вставляться динамически. Например,
- фильтр обработки HTML будет работать только в том случае, если содержимое является text/html или application/xhtml+xml
- Фильтр сжатия будет работать только в том случае, если входные данные относятся к сжимаемому типу и еще не сжаты.
- Фильтр преобразования кодировки будет вставлен, если текстовый документ еще не находится в нужной кодировке.
Предоставление фильтров как службы HTTP
Фильтры можно использовать для обработки содержимого, исходящего от клиента, в дополнение к обработке содержимого, исходящего с сервера, с помощью модуля
mod_reflector
.
mod_reflector
принимает POST-запросы от клиентов и отражает тело запроса содержимого, полученное в рамках POST-запроса, обратно в ответ, проходя через стек выходных фильтров на обратном пути к клиенту.
Этот метод можно использовать в качестве альтернативы веб-службе, работающей в стеке сервера приложений, где выходной фильтр обеспечивает преобразование, необходимое для тела запроса. Например, mod_deflate
модуль можно использовать для предоставления общего сервиса сжатия или фильтр преобразования изображения можно превратить в сервис преобразования изображения.
Использование фильтров
Существует два способа использования фильтрации: простой и динамический. В общем, вы должны использовать один или другой; их смешивание может иметь неожиданные последствия (хотя простую входную фильтрацию можно свободно смешивать с простой или динамической выходной фильтрацией).
Простой способ — это единственный способ настройки входных фильтров, и его достаточно для выходных фильтров, где вам нужна статическая цепочка фильтров. Соответствующие директивы
SetInputFilter
,
SetOutputFilter
,
AddInputFilter
,
AddOutputFilter
,
RemoveInputFilter
и
RemoveOutputFilter
.
Динамический способ обеспечивает как статическую, так и гибкую динамическую настройку выходных фильтров, как описано на mod_filter
странице. Соответствующие директивы
FilterChain
,
FilterDeclare
, и
FilterProvider
.
Еще одна директива AddOutputFilterByType
все еще поддерживается, но считается устаревшей. Вместо этого используйте динамическую конфигурацию.