<-
Apache HTTP 服务器 2.4 > Apache模块mod_filter

Apache模块mod_filter

描述:上下文相关的智能过滤器配置模块
状态:基础
模块标识符:filter_module
源文件:mod_filter.c
兼容性:2.1版及更高版本

摘要

该模块可对输出内容过滤器进行智能的,上下文相关的配置。例如,即使预先不知道内容类型(例如,在代理中),apache也可以配置为通过不同的过滤器处理不同的内容类型。

mod_filter通过将间接引入过滤器链来工作。我们没有在链中插入过滤器,而是插入了过滤器线束,后者又有条件地分派给过滤器提供者。任何内容过滤器都可以作为提供者mod_filter; 无需更改现有的过滤器模块(尽管可以简化它们)。

支持Apache!

主题

指令

错误修正清单

也可以看看

最佳

智能过滤

在传统过滤模型中,使用AddOutputFilterand系列无条件插入过滤器。然后,每个过滤器都需要确定是否运行,并且服务器管理员几乎没有灵活性来允许动态配置链。

mod_filter相比之下,服务器管理员在配置筛选器链时具有很大的灵活性。实际上,可以基于复杂的布尔表达式插入过滤器。 这概括了所提供的有限的灵活性AddOutputFilterByType

最佳

筛选器声明,提供者和链

[此图像显示了传统的过滤器模型]
图1:传统的过滤器模型

在传统模型中,输出过滤器是一条从内容生成器(处理程序)到客户端的简单链。只要可以正确配置过滤器链,此方法就可以很好地工作,但是当需要根据处理程序的结果动态配置过滤器时,就会出现问题。

[此图显示了mod_filter模型]
图2:mod_filter模型

mod_filter通过将间接引入过滤器链来工作。我们没有在链中插入过滤器,而是插入了过滤器线束,后者又有条件地分派给过滤器提供者。任何内容过滤器都可以作为提供者mod_filter; 无需更改现有的过滤器模块(尽管可以简化它们)。一个过滤器可以有多个提供程序,但对于单个请求,最多只能运行一个提供程序。

过滤器链包括过滤器线束的任意数量的实例,每个实例可以具有任意数量的提供者。一种特殊情况是具有无条件分派的单个提供程序:这等效于将提供程序过滤器直接插入到链中。

最佳

配置链

使用来配置过滤器链分为三个阶段 mod_filter。有关指令的详细信息,请参见下文。

声明过滤器
FilterDeclare指令声明一个过滤器,为其分配名称和过滤器类型。仅当过滤器不是默认类型AP_FTYPE_RESOURCE时才需要。
注册提供商
FilterProvider 指令将提供程序注册到过滤器。过滤器可能已经用声明了FilterDeclare;如果不是,FilterProvider将使用默认类型AP_FTYPE_RESOURCE隐式声明它。提供者必须已ap_register_output_filter通过某个模块注册。最后一个参数FilterProvider是表达式:只有且表达式的计算结果为true时,才会选择提供程序来运行请求。该表达式可以求值HTTP请求或响应标头,环境变量或此请求使用的处理程序。与早期版本不同,mod_filter现在支持复杂的表达式,该表达式涉及带有AND / OR逻辑(&& / ||)和方括号的多个条件。表达式语法的详细信息在ap_expr文档中进行了描述
配置链
上面的指令构建了智能过滤器链的组件,但没有将其配置为运行。该FilterChain指令从声明的智能过滤器构建过滤器链,从而提供了在链的开始或末端插入过滤器,移除过滤器或清除链的灵活性。
最佳

筛选和响应状态

mod_filter通常仅对HTTP状态为200(OK)的响应运行筛选器。如果要过滤具有其他响应状态的文档,则可以设置filter-errordocs 环境变量,该变量将对所有响应起作用,而与状态无关。要进一步优化,可以将表达式条件与一起使用FilterProvider

最佳

从Apache HTTP Server 2.2配置升级

FilterProvider 指令已从httpd 2.2进行了更改:matchdispatch参数被单个但更通用的表达式替换。通常,您可以使用以下方法将匹配/发送对转换为表达式的两侧:

"dispatch = 'match'"

现在分别从语法%{req:foo}%{resp:foo}%{env:foo}解释Request头,Response头和Environment变量。 还支持变量%{HANDLER}%{CONTENT_TYPE}

请注意,该匹配不再支持子字符串匹配。可以将它们替换为正则表达式匹配项。

最佳

例子

服务器端包含(SSI)
一个简单的替换案例 AddOutputFilterByType
FilterDeclare SSI
FilterProvider SSI INCLUDES "%{CONTENT_TYPE} =~ m|^text/html|"
FilterChain SSI
服务器端包含(SSI)
与上述相同,但在处理程序上调度(经典SSI行为; .shtml文件得到处理)。
FilterProvider SSI INCLUDES "%{HANDLER} = 'server-parsed'"
FilterChain SSI
用mod_deflate模拟mod_gzip
仅当Accept-Encoding标头中没有“ gzip”时,才插入INFLATE过滤器。该过滤器以ftype CONTENT_SET运行。
FilterDeclare gzip CONTENT_SET
FilterProvider gzip inflate "%{req:Accept-Encoding} !~ /gzip/"
FilterChain gzip
图像下采样
假设我们要对所有Web图像进行降采样,并具有用于GIF,JPEG和PNG的过滤器。
FilterProvider unpack jpeg_unpack "%{CONTENT_TYPE} = 'image/jpeg'"
FilterProvider unpack gif_unpack  "%{CONTENT_TYPE} = 'image/gif'"
FilterProvider unpack png_unpack  "%{CONTENT_TYPE} = 'image/png'"

FilterProvider downsample downsample_filter "%{CONTENT_TYPE} = m|^image/(jpeg|gif|png)|"
FilterProtocol downsample "change=yes"

FilterProvider repack jpeg_pack "%{CONTENT_TYPE} = 'image/jpeg'"
FilterProvider repack gif_pack  "%{CONTENT_TYPE} = 'image/gif'"
FilterProvider repack png_pack  "%{CONTENT_TYPE} = 'image/png'"
<Location "/image-filter">
    FilterChain unpack downsample repack
</Location>
最佳

协议处理

从历史上看,每个过滤器负责确保在HTTP响应标头中正确表示它所做的任何更改,并且在进行非法更改时不运行。这给过滤器作者带来了负担,他们需要在每个过滤器中重新实现一些常用功能:

mod_filter目的是为过滤器实现的这些细节提供通用处理,从而降低内容过滤器模块所需的复杂性。这是正在进行的工作;该 FilterProtocol工具的一些此功能对于与Apache 2.0模块向后兼容性。对于httpd 2.1及更高版本, ap_register_output_filter_protocolap_filter_protocolAPI使过滤器模块可以声明自己的行为。

同时,mod_filter不应干扰要处理协议所有方面的过滤器。默认情况下(即在没有任何FilterProtocol指令的情况下),mod_filter 将使标题保持不变。

在编写本文时,此功能尚未经过测试,因为常用的模块旨在与2.0一起使用。使用它的模块应该仔细测试。

最佳

AddOutputFilterByType 指令

描述:将输出过滤器分配给特定的媒体类型
句法:AddOutputFilterByType filter[;filter...] media-type [media-type] ...
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:文件信息
状态:基础
模块:mod_filter
兼容性:mod_filter在版本2.3.7中移至之前有严格的限制

该指令根据响应media-type激活请求的特定输出过滤器

以下示例使用的DEFLATE过滤器mod_deflate。它将压缩所有标记为text/htmltext/plain在发送到客户端之前的输出(静态或动态) 。

AddOutputFilterByType DEFLATE text/html text/plain

如果希望内容由多个过滤器处理,则其名称必须用分号分隔。AddOutputFilterByType每个过滤器也可以使用一个 指令。

以下配置使所有标记为的脚本输出 text/html首先由 INCLUDES过滤器处理,然后由DEFLATE 过滤器处理。

<Location "/cgi-bin/">
    Options Includes
    AddOutputFilterByType INCLUDES;DEFLATE text/html
</Location>

也可以看看

最佳

FilterChain 指令

描述:配置过滤器链
句法:FilterChain [+=-@!]filter-name ...
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:选件
状态:基础
模块:mod_filter

这将从声明的过滤器配置实际的过滤器链。 FilterChain接受任意数量的参数,每个参数可选地以单字符控件开头,该控件确定要执行的操作:

+filter-name
过滤器名称添加到过滤器链的末尾
@filter-name
过滤器链的开头插入过滤器名称
-filter-name
过滤器链中删除过滤器名称
=filter-name
清空过滤器链并插入过滤器名称
!
清空过滤链
filter-name
相当于 +filter-name
最佳

FilterDeclare 指令

描述:声明一个智能过滤器
句法:FilterDeclare filter-name [type]
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:选件
状态:基础
模块:mod_filter

该指令声明输出过滤器以及将确定运行时配置的标头或环境变量。第一个参数是一个过滤器名称 的使用FilterProviderFilterChainFilterProtocol指令。

最终的(可选的)参数是过滤器的类型,并采取的值ap_filter_type -即RESOURCE(缺省值), ,CONTENT_SET, ,PROTOCOL 或。TRANSCODECONNECTIONNETWORK

最佳

FilterProtocol 指令

描述:处理正确的HTTP协议处理
句法:FilterProtocol filter-name [provider-name] proto-flags
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:选件
状态:基础
模块:mod_filter

这样mod_filter做的目的是确保过滤器在不应该运行时不运行,并考虑到过滤器的影响正确设置了HTTP响应标头。

该指令有两种形式。具有三个参数,它专门适用于该过滤器的过滤器名称提供者名称。只要有两个参数,它就会在过滤器运行任何提供程序时应用于过滤器名称

用此伪指令指定的标志与基础提供程序可能已向其注册的标志合并 mod_filter。例如,过滤器可以在内部指定的等效项change=yes,但模块的特定配置可以用覆盖change=no

原型标志是以下一项或多项

change=yes|no
指定过滤器是否更改内容,包括可能的内容长度。2.4.7和更高版本支持“ no”参数。
change=1:1
过滤器更改内容,但不会更改内容长度
byteranges=no
过滤器无法在字节范围上工作,需要完整的输入
proxy=no
筛选器不应在代理上下文中运行
proxy=transform
过滤器以与HTTP Cache-Control: no-transform标头不兼容的方式转换响应。
cache=no
过滤器使输出不可缓存(例如,通过引入随机的内容更改)
最佳

FilterProvider 指令

描述:注册内容过滤器
句法:FilterProvider filter-name provider-name expression
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:选件
状态:基础
模块:mod_filter

该指令注册了智能过滤器的提供程序。当且仅 当第一次调用线束时声明的表达式的值为真时,才会调用提供程序。

provider-name必须已经通过加载使用来注册名称的模块来注册 ap_register_output_filter

表达式ap_expr

也可以看看

最佳

FilterTrace 指令

描述:从获取调试/诊断信息 mod_filter
句法:FilterTrace filter-name level
内容:服务器配置,虚拟主机,目录
状态:基础
模块:mod_filter

该指令从中生成调试信息 mod_filter。它旨在帮助测试和调试提供程序(过滤器模块),尽管它mod_filter本身也会有所帮助。

调试输出取决于设置的级别

0 (默认)
没有调试信息生成。
1
mod_filter在提供者处理它们之前,它将记录通过过滤器的桶和旅到错误日志。这类似于mod_diagnostics生成的信息 。
2 (尚未实现)
将转储提供者之前传递到临时文件的完整数据。仅用于单用户调试;这将不支持并发命中。

可用语言: zh  |  fr 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。