Apache 过滤器
Apache Filters
Apache 2 中的过滤器
| 相关模块 | 相关指令 |
|---|---|
[mod_filter][mod_deflate][mod_ext_filter][mod_include][mod_charset_lite][mod_reflector][mod_buffer][mod_data][mod_ratelimit][mod_reqtimeout][mod_request][mod_sed][mod_substitute][mod_xml2enc][mod_proxy_html] |
[FilterChain][FilterDeclare][FilterProtocol][FilterProvider][AddInputFilter][AddOutputFilter][RemoveInputFilter][RemoveOutputFilter][ReflectorHeader][ExtFilterDefine][ExtFilterOptions][SetInputFilter][SetOutputFilter] |
Apache 2.0 之后的版本有了过滤链(Filter Chain)这个概念,有了它以后,应用程序能够以一种高灵活、可配置的方式来处理传入和传出的数据,完全不用考虑数据是从哪里来的。
根据需要,可以对传入的数据进行预处理,对传出的数据进行后处理。这基本上独立于传统的请求处理阶段。

在标准的 Aapche 版本中有一些过滤器,如:
mod_include :服务端 include
mod_ssl :SSL 加密
mod_deflate :实时压缩、解压
mod_charset_lite :转换字符集
mod_ext_filter :运行外部程序,做为过滤器
Apache 内部也使用一些过滤器,用于处理像 chunking 和 byte-range 这样的函数。
大量的程序是通过第三方过滤器模块来部署的,它们可以从 modules.apache.org 获取。如:
- HTML 和 XML 处理及重写
- XSLT 转换及 XIncludes
- XML 命令空间的支持
- 处理 HTML 表单上传的文件,并对其进行解码
- 图像处理
- 保护 PHP 脚本等易受攻击的程序
- 文本的搜索和替换
智能过滤

mod_filter 在 Apache 2.1 之后的版本中可用,它可以让过滤链在运行时能够动态配置。例如,你可以设置一个代理,用一个 HTML 过滤器来重写 HTML,用另一个过滤器来重写 JPEG 图像,尽管代理无法预知源服务器会发送什么信息。这是由过滤器束(filter harness)实现的,在运行时,根据具体的内容为其分配不同的提供程序。过滤器既可以直接插入过滤链,然后无条件运行,也可以作为提供程序使用,动态地插入。例如:
- 只有当内容为 text/html 或 application/xhtml+xml 时,才会运行处理 HTML 的过滤器
- 只有当输入为可压缩类型,且未被压缩时,才会运行压缩过滤器
- 只有当文本文档不是希望的字符集时,才会插入字符集转换的过滤器
把过滤器当作 HTTP 服务
除了处理来自服务端的内容,过滤器还可使用 mod_reflector 模块来处理来自客户端的内容。
mod_reflector 会接收来自客户端的 POST 请求,并将收到的内容在回复中反射回去,在返回客户端的过程中会穿越输出过滤器。
此技术可用于替代在应用程序服务器堆栈中运行的 web 服务,其中输出筛选器提供请求正文所需的转换。例如,mod_deflate 模块可用来提供一般的压缩服务,或图像转换过滤器可用来提供图像转换服务。
如何使用过滤器
有两种方法来使用过滤器:简易和动态。
一般只使用其中的一种方法,混合使用会造成不可预料的结果。
简易方法
简易方法是配置输入过滤的唯一方法,在需要一个静态过滤链时,也可以用于输出过滤。
相关的指令为 :SetInputFilter、SetOutputFilter、AddInputFilter、AddOutputFilter、RemoveInputFilter、RemoveOutputFilter`
动态方法
使用动态方法可以对输出过滤进行静态的、灵活的、动态的配置,相关的指令为 FilterChain、FilterDeclare、FilterProvider。