Модуль Apache mod_ext_filter
| Описание: | Передача тела ответа через внешнюю программу перед отправкой клиенту |
|---|---|
| Статус: | Расширение |
| Идентификатор модуля: | ext_filter_module |
| Исходный файл: | mod_ext_filter.c |
Краткое описание
mod_ext_filter представляет собой простую и знакомую модель программирования для фильтров. С помощью этого модуля программа, которая читает данные из stdin и записывает их в stdout (то есть команда-фильтр в стиле Unix), может выступать в качестве фильтра Apache. Этот механизм фильтрации значительно медленнее, чем использование фильтра, специально написанного для API Apache и работающего внутри процесса сервера Apache, но у него есть следующие преимущества:
- модель программирования значительно проще
- можно использовать любой язык программирования или сценариев, если он позволяет программе читать данные из стандартного ввода и записывать их в стандартный вывод
- существующие программы можно использовать в качестве фильтров Apache без изменений
Даже если характеристики производительности не подходят для использования в рабочей среде, mod_ext_filter можно использовать как прототипную среду для фильтров.
Примеры
Генерация HTML из ответа другого типа
# mod_ext_filter directive to define a filter
# to HTML-ize text/c files using the external
# program /usr/bin/enscript, with the type of
# the result set to text/html
ExtFilterDefine c-to-html mode=output \
intype=text/c outtype=text/html \
cmd="/usr/bin/enscript --color -w html -Ec -o -"
<Directory "/export/home/trawick/apacheinst/htdocs/c">
# core directive to cause the new filter to
# be run on output
SetOutputFilter c-to-html
# mod_mime directive to set the type of .c
# files to text/c
AddType text/c .c
</Directory> Реализация фильтра кодирования содержимого
Примечание: этот пример с gzip приведён только для иллюстрации. Практическую реализацию см. в mod_deflate.
# mod_ext_filter directive to define the external filter
ExtFilterDefine gzip mode=output cmd=/bin/gzip
<Location "/gzipped">
# core directive to cause the gzip filter to be
# run on output
SetOutputFilter gzip
# mod_headers directive to add
# "Content-Encoding: gzip" header field
Header set Content-Encoding gzip
</Location> Замедление работы сервера
# mod_ext_filter directive to define a filter
# which runs everything through cat; cat doesn't
# modify anything; it just introduces extra pathlength
# and consumes more resources
ExtFilterDefine slowdown mode=output cmd=/bin/cat \
preservescontentlength
<Location "/">
# core directive to cause the slowdown filter to
# be run several times on output
#
SetOutputFilter slowdown;slowdown;slowdown
</Location> Использование sed для замены текста в ответе
# mod_ext_filter directive to define a filter which
# replaces text in the response
#
ExtFilterDefine fixtext mode=output intype=text/html \
cmd="/bin/sed s/verdana/arial/g"
<Location "/">
# core directive to cause the fixtext filter to
# be run on output
SetOutputFilter fixtext
</Location> То же самое можно сделать с помощью mod_substitute, не запуская внешний процесс.
Трассировка другого фильтра
# Trace the data read and written by mod_deflate
# for a particular client (IP 192.168.1.31)
# experiencing compression problems.
# This filter will trace what goes into mod_deflate.
ExtFilterDefine tracebefore \
cmd="/bin/tracefilter.pl /tmp/tracebefore" \
EnableEnv=trace_this_client
# This filter will trace what goes after mod_deflate.
# Note that without the ftype parameter, the default
# filter type of AP_FTYPE_RESOURCE would cause the
# filter to be placed *before* mod_deflate in the filter
# chain. Giving it a numeric value slightly higher than
# AP_FTYPE_CONTENT_SET will ensure that it is placed
# after mod_deflate.
ExtFilterDefine traceafter \
cmd="/bin/tracefilter.pl /tmp/traceafter" \
EnableEnv=trace_this_client ftype=21
<Directory "/usr/local/docs">
SetEnvIf Remote_Addr 192.168.1.31 trace_this_client
SetOutputFilter tracebefore;deflate;traceafter
</Directory> Вот фильтр, который отслеживает данные:
#!/usr/local/bin/perl -w
use strict;
open(SAVE, ">$ARGV[0]")
or die "can't open $ARGV[0]: $?";
while (<STDIN>) {
print SAVE $_;
print $_;
}
close(SAVE); Директива ExtFilterDefine
| Описание: | Определение внешнего фильтра |
|---|---|
| Синтаксис: | ExtFilterDefine filtername parameters |
| Контекст: | конфигурация сервера |
| Статус: | Расширение |
| Модуль: | mod_ext_filter |
Директива ExtFilterDefine задаёт характеристики внешнего фильтра, в том числе запускаемую программу и её аргументы.
filtername задаёт имя определяемого фильтра. Это имя можно использовать в директивах SetOutputFilter. Оно должно быть уникальным среди всех зарегистрированных фильтров. В настоящее время API регистрации фильтров не сообщает об ошибках, поэтому о проблеме с повторяющимися именами пользователь не узнает.
Последующие параметры можно указывать в любом порядке; они задают внешнюю команду для запуска и некоторые другие характеристики. Единственный обязательный параметр — cmd=. Возможны следующие параметры:
cmd=cmdline- Ключевое слово
cmd=позволяет указать внешнюю команду для запуска. Если после имени программы указаны аргументы, командную строку следует заключить в кавычки (например,cmd="/bin/mypgm arg1 arg2".) Обычное экранирование оболочки не требуется, поскольку программа запускается напрямую, без оболочки. Аргументы программы разделяются пробелами. Чтобы включить пробелы в аргумент программы, их можно экранировать обратной косой чертой. Все обратные косые черты, входящие в состав аргумента, необходимо экранировать ещё одной обратной косой чертой. Помимо стандартных переменных окружения CGI, для программы также будут заданы DOCUMENT_URI, DOCUMENT_PATH_INFO и QUERY_STRING_UNESCAPED. mode=mode- Используйте
mode=output(значение по умолчанию) для фильтров, обрабатывающих ответ. Используйтеmode=inputдля фильтров, обрабатывающих запрос.mode=inputдоступен в Apache 2.1 и более поздних версиях. intype=imt- Этот параметр задаёт тип интернет-медиа (то есть, MIME-тип) документов, которые следует фильтровать. По умолчанию фильтруются все документы. Если указан
intype=, фильтр будет отключён для документов других типов. outtype=imt- Этот параметр задаёт тип интернет-медиа (то есть, MIME-тип) отфильтрованных документов. Он полезен, если в ходе фильтрации фильтр меняет тип интернет-медиа. По умолчанию тип интернет-медиа не меняется.
PreservesContentLength- Ключевое слово
PreservesContentLengthуказывает, что фильтр сохраняет длину содержимого. Это не значение по умолчанию, поскольку большинство фильтров изменяют длину содержимого. Если фильтр не меняет длину, следует указать это ключевое слово. ftype=filtertype- Этот параметр задаёт числовое значение типа фильтра, под которым следует зарегистрировать фильтр. Значения по умолчанию AP_FTYPE_RESOURCE достаточно в большинстве случаев. Если фильтр должен работать в цепочке фильтров на этапе, отличном от этапа фильтров ресурсов, необходимо указать этот параметр. Подходящие значения см. в определениях AP_FTYPE_foo в файле util_filter.h.
disableenv=env- Этот параметр задаёт имя переменной окружения, установка которой отключит фильтр.
enableenv=env- Этот параметр задаёт имя переменной окружения, которую необходимо установить, иначе фильтр будет отключён.
Директива ExtFilterOptions
| Описание: | Настройка параметров mod_ext_filter |
|---|---|
| Синтаксис: | ExtFilterOptions option [option] ... |
| Значение по умолчанию: | ExtFilterOptions NoLogStderr |
| Контекст: | каталог |
| Статус: | Расширение |
| Модуль: | mod_ext_filter |
Директива ExtFilterOptions задаёт специальные параметры обработки для mod_ext_filter. Option может иметь одно из следующих значений:
LogStderr | NoLogStderr- Ключевое слово
LogStderrуказывает, что сообщения, записанные внешней программой-фильтром в стандартный поток ошибок, будут сохраняться в журнале ошибок Apache.NoLogStderrотключает эту функцию. Onfail=[abort|remove]- Определяет, что делать, если не удаётся запустить внешнюю программу-фильтр. При значении
abort(значение по умолчанию) обработка запроса будет прервана. При значенииremoveфильтр удаляется, и обработка запроса продолжается без него.
ExtFilterOptions LogStderr
Сообщения, записанные в стандартный поток ошибок фильтра, будут сохраняться в журнале ошибок Apache.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_ext_filter.html