<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_ext_filter

可用语言:  en  |  fr  |  ja  |  ko 

描述在将响应主体传递给客户端之前,通过外部程序传递它。
状态扩展
模块标识符ext_filter_module
源文件mod_ext_filter.c

摘要

mod_ext_filter过滤器 提供了一个简单且熟悉的编程模型。使用此模块,从 stdin 读取并写入 stdout 的程序(即 Unix 风格的过滤器命令)可以成为 Apache 的过滤器。这种过滤机制比使用专门为 Apache API 编写的并在 Apache 服务器进程内部运行的过滤器要慢得多,但它确实具有以下优点

即使性能特征不适合生产使用,mod_ext_filter 也可以用作过滤器的原型环境。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

示例

从其他类型的响应生成 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);
top

ExtFilterDefine 指令

描述定义外部过滤器
语法ExtFilterDefine filtername parameters
上下文服务器配置
状态扩展
模块mod_ext_filter

ExtFilterDefine 指令定义了外部过滤器的特性,包括要运行的程序及其参数。

filtername 指定要定义的过滤器的名称。此名称随后可以在 SetOutputFilter 指令中使用。它必须在所有已注册的过滤器中是唯一的。目前,注册过滤器 API 不会报告任何错误,因此重复名称的问题不会报告给用户。

后续参数可以以任何顺序出现,并定义要运行的外部命令以及某些其他特性。唯一必需的参数是 cmd=。这些参数是

cmd=cmdline
cmd= 关键字允许您指定要运行的外部命令。如果程序名称后面有参数,则命令行应放在引号中(例如cmd="/bin/mypgm arg1 arg2")。由于程序直接运行,绕过了 shell,因此不需要正常的 shell 引号。程序参数以空格分隔。可以使用反斜杠转义应作为程序参数一部分的空格。任何作为参数一部分的反斜杠必须用反斜杠本身转义。除了标准 CGI 环境变量外,DOCUMENT_URI、DOCUMENT_PATH_INFO 和 QUERY_STRING_UNESCAPED 也将为程序设置。
mode=mode
对于处理响应的过滤器,使用 mode=output(默认值)。对于处理请求的过滤器,使用 mode=inputmode=input 在 Apache 2.1 及更高版本中可用。
intype=imt
此参数指定应过滤的文档的互联网媒体类型(,MIME 类型)。默认情况下,所有文档都会被过滤。如果指定了 intype=,则过滤器将对其他类型的文档禁用。
outtype=imt
此参数指定已过滤文档的互联网媒体类型(,MIME 类型)。当过滤器将互联网媒体类型更改为过滤操作的一部分时,它很有用。默认情况下,互联网媒体类型保持不变。
PreservesContentLength
PreservesContentLength 关键字指定过滤器保留内容长度。这不是默认值,因为大多数过滤器都会更改内容长度。如果过滤器没有修改长度,则应指定此关键字。
ftype=filtertype
此参数指定过滤器应注册为的过滤器类型的数值。在大多数情况下,默认值 AP_FTYPE_RESOURCE 就足够了。如果过滤器需要在与资源过滤器不同的位置在过滤器链中运行,那么此参数将是必需的。有关适当的值,请参阅 util_filter.h 中的 AP_FTYPE_foo 定义。
disableenv=env
此参数指定环境变量的名称,如果设置了该变量,则将禁用过滤器。
enableenv=env
此参数指定必须设置的环境变量的名称,否则过滤器将被禁用。
top

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 错误日志中。

可用语言:  en  |  fr  |  ja  |  ko 

top

评论

注意
这不是问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果它们被实施或被认为无效/主题无关,可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表