描述: | 上下文相关的智能过滤器配置模块 |
---|---|
状态: | 基础 |
模块标识符: | filter_module |
源文件: | mod_filter.c |
兼容性: | 2.1版及更高版本 |
该模块可对输出内容过滤器进行智能的,上下文相关的配置。例如,即使预先不知道内容类型(例如,在代理中),apache也可以配置为通过不同的过滤器处理不同的内容类型。
mod_filter
通过将间接引入过滤器链来工作。我们没有在链中插入过滤器,而是插入了过滤器线束,后者又有条件地分派给过滤器提供者。任何内容过滤器都可以作为提供者mod_filter
; 无需更改现有的过滤器模块(尽管可以简化它们)。
在传统过滤模型中,使用AddOutputFilter
and系列无条件插入过滤器。然后,每个过滤器都需要确定是否运行,并且服务器管理员几乎没有灵活性来允许动态配置链。
mod_filter
相比之下,服务器管理员在配置筛选器链时具有很大的灵活性。实际上,可以基于复杂的布尔表达式插入过滤器。
这概括了所提供的有限的灵活性AddOutputFilterByType
。
图1:传统的过滤器模型
在传统模型中,输出过滤器是一条从内容生成器(处理程序)到客户端的简单链。只要可以正确配置过滤器链,此方法就可以很好地工作,但是当需要根据处理程序的结果动态配置过滤器时,就会出现问题。
图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
。
该FilterProvider
指令已从httpd 2.2进行了更改:match和
dispatch参数被单个但更通用的表达式替换。通常,您可以使用以下方法将匹配/发送对转换为表达式的两侧:
"dispatch = 'match'"
现在分别从语法%{req:foo}, %{resp:foo}和%{env:foo}解释Request头,Response头和Environment变量。 还支持变量%{HANDLER}和%{CONTENT_TYPE}。
请注意,该匹配不再支持子字符串匹配。可以将它们替换为正则表达式匹配项。
AddOutputFilterByType
FilterDeclare SSI FilterProvider SSI INCLUDES "%{CONTENT_TYPE} =~ m|^text/html|" FilterChain SSI
FilterProvider SSI INCLUDES "%{HANDLER} = 'server-parsed'" FilterChain SSI
FilterDeclare gzip CONTENT_SET FilterProvider gzip inflate "%{req:Accept-Encoding} !~ /gzip/" FilterChain gzip
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响应标头中正确表示它所做的任何更改,并且在进行非法更改时不运行。这给过滤器作者带来了负担,他们需要在每个过滤器中重新实现一些常用功能:
Cache-Control: no-transform
来自后端的标头。mod_filter
目的是为过滤器实现的这些细节提供通用处理,从而降低内容过滤器模块所需的复杂性。这是正在进行的工作;该
FilterProtocol
工具的一些此功能对于与Apache 2.0模块向后兼容性。对于httpd 2.1及更高版本,
ap_register_output_filter_protocol
和
ap_filter_protocol
API使过滤器模块可以声明自己的行为。
同时,mod_filter
不应干扰要处理协议所有方面的过滤器。默认情况下(即在没有任何FilterProtocol
指令的情况下),mod_filter
将使标题保持不变。
在编写本文时,此功能尚未经过测试,因为常用的模块旨在与2.0一起使用。使用它的模块应该仔细测试。
描述: | 将输出过滤器分配给特定的媒体类型 |
---|---|
句法: | AddOutputFilterByType filter[;filter...]
media-type [media-type] ... |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
覆写: | 文件信息 |
状态: | 基础 |
模块: | mod_filter |
兼容性: | mod_filter 在版本2.3.7中移至之前有严格的限制 |
该指令根据响应media-type激活请求的特定输出过滤器。
以下示例使用的DEFLATE
过滤器mod_deflate
。它将压缩所有标记为text/html
或text/plain
在发送到客户端之前的输出(静态或动态)
。
AddOutputFilterByType DEFLATE text/html text/plain
如果希望内容由多个过滤器处理,则其名称必须用分号分隔。AddOutputFilterByType
每个过滤器也可以使用一个
指令。
以下配置使所有标记为的脚本输出
text/html
首先由
INCLUDES
过滤器处理,然后由DEFLATE
过滤器处理。
<Location "/cgi-bin/"> Options Includes AddOutputFilterByType INCLUDES;DEFLATE text/html </Location>
描述: | 配置过滤器链 |
---|---|
句法: | FilterChain [+=-@!]filter-name ... |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
覆写: | 选件 |
状态: | 基础 |
模块: | mod_filter |
这将从声明的过滤器配置实际的过滤器链。
FilterChain
接受任意数量的参数,每个参数可选地以单字符控件开头,该控件确定要执行的操作:
+filter-name
@filter-name
-filter-name
=filter-name
!
filter-name
+filter-name
描述: | 声明一个智能过滤器 |
---|---|
句法: | FilterDeclare filter-name [type] |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
覆写: | 选件 |
状态: | 基础 |
模块: | mod_filter |
该指令声明输出过滤器以及将确定运行时配置的标头或环境变量。第一个参数是一个过滤器名称
的使用FilterProvider
,
FilterChain
和
FilterProtocol
指令。
最终的(可选的)参数是过滤器的类型,并采取的值ap_filter_type
-即RESOURCE
(缺省值), ,CONTENT_SET
,
,PROTOCOL
或。TRANSCODE
CONNECTION
NETWORK
描述: | 处理正确的HTTP协议处理 |
---|---|
句法: | FilterProtocol filter-name [provider-name]
proto-flags |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
覆写: | 选件 |
状态: | 基础 |
模块: | mod_filter |
这样mod_filter
做的目的是确保过滤器在不应该运行时不运行,并考虑到过滤器的影响正确设置了HTTP响应标头。
该指令有两种形式。具有三个参数,它专门适用于该过滤器的过滤器名称和 提供者名称。只要有两个参数,它就会在过滤器运行任何提供程序时应用于过滤器名称。
用此伪指令指定的标志与基础提供程序可能已向其注册的标志合并
mod_filter
。例如,过滤器可以在内部指定的等效项change=yes
,但模块的特定配置可以用覆盖change=no
。
原型标志是以下一项或多项
change=yes|no
change=1:1
byteranges=no
proxy=no
proxy=transform
Cache-Control: no-transform
标头不兼容的方式转换响应。cache=no
描述: | 注册内容过滤器 |
---|---|
句法: | FilterProvider filter-name provider-name
expression |
内容: | 服务器配置,虚拟主机,目录,.htaccess |
覆写: | 选件 |
状态: | 基础 |
模块: | mod_filter |
该指令注册了智能过滤器的提供程序。当且仅 当第一次调用线束时声明的表达式的值为真时,才会调用提供程序。
provider-name必须已经通过加载使用来注册名称的模块来注册
ap_register_output_filter
。
表达式是 ap_expr。
mod_include
描述: | 从获取调试/诊断信息
mod_filter |
---|---|
句法: | FilterTrace filter-name level |
内容: | 服务器配置,虚拟主机,目录 |
状态: | 基础 |
模块: | mod_filter |
该指令从中生成调试信息
mod_filter
。它旨在帮助测试和调试提供程序(过滤器模块),尽管它mod_filter
本身也会有所帮助。
调试输出取决于设置的级别:
0
(默认)1
mod_filter
在提供者处理它们之前,它将记录通过过滤器的桶和旅到错误日志。这类似于mod_diagnostics生成的信息
。
2
(尚未实现)