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)这个概念,有了它以后,应用程序能够以一种高灵活、可配置的方式来处理传入和传出的数据,完全不用考虑数据是从哪里来的。

根据需要,可以对传入的数据进行预处理,对传出的数据进行后处理。这基本上独立于传统的请求处理阶段。

image-center

在标准的 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 脚本等易受攻击的程序
  • 文本的搜索和替换

智能过滤

image-center

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 模块可用来提供一般的压缩服务,或图像转换过滤器可用来提供图像转换服务。

如何使用过滤器

有两种方法来使用过滤器:简易和动态。

一般只使用其中的一种方法,混合使用会造成不可预料的结果。

简易方法

简易方法是配置输入过滤的唯一方法,在需要一个静态过滤链时,也可以用于输出过滤。

相关的指令为 :SetInputFilterSetOutputFilterAddInputFilterAddOutputFilterRemoveInputFilter、RemoveOutputFilter`

动态方法

使用动态方法可以对输出过滤进行静态的、灵活的、动态的配置,相关的指令为 FilterChainFilterDeclareFilterProvider