Модуль 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