Spec-Zone.ru › Apache HTTP Server

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

Spec-Zone.ru

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