# Apache模块 mod_deflate
| [说明](#calibre_link-11) | 压缩发送给客户端的内容 |
| --- | --- |
| [状态](#calibre_link-12) | 扩展(E) |
| [模块名](#calibre_link-13) | deflate_module |
| [源文件](#calibre_link-14) | mod_deflate.c |
### 概述
`mod_deflate`模块提供了`DEFLATE`输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。
## 配置举例
这是一个针对心急者的示范配置:
### 仅仅压缩少数几种类型
```
AddOutputFilterByType DEFLATE text/html text/plain text/xml
```
以下允许压缩更多内容的配置更加复杂。除非你明白所有的配置细节,否则请不要使用。
### Compress everything except images
```
<Location />
# 插入过滤器
SetOutputFilter DEFLATE
# Netscape 4.x 有一些问题...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 有更多的问题
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE 会伪装成 Netscape ,但是事实上它没有问题
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 不压缩图片
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# 确保代理不会发送错误的内容
Header append Vary User-Agent env=!dont-vary
</Location>
```
## 启用压缩
### 输出压缩
压缩是由`DEFLATE`[过滤器](#calibre_link-15)实现的。下面的指令会对其所在容器中的文档启用压缩:
```
SetOutputFilter DEFLATE
```
一些流行的浏览器不能正确处理所有压缩内容,因此你可能需要将`gzip-only-text/html`标记设为"`1`"来仅仅允许压缩html文件(见下面)。如果你设置了_"`1`"以外的任何值_,都将被忽略。
如果你想将压缩限制在几种特定的MIME类型上,可以使用`AddOutputFilterByType`指令。下面的例子仅仅允许对html文档进行压缩:
```
<Directory "/your-server-root/manual">
AddOutputFilterByType DEFLATE text/html
</Directory>
```
对于那些不能正确处理所有压缩内容的浏览器,可以使用`BrowserMatch`指令针对特定的浏览器设置`no-gzip`标记以取消压缩。为了取得更好的效果,你可以将`no-gzip`和`gzip-only-text/html`配合使用。在这种情况下,下面的设置将会覆盖上面的设置。看看从[配置示例](#calibre_link-1035)中摘录的片断:
```
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
```
第一条指令表示如果`User-Agent`字符串表示它是一个Navigator 4.x的浏览器,这种浏览器不能正确处理除`text/html`之外的所有类型。而4.06, 4.07, 4.08版的Navigator完全不能处理任何压缩内容,因此第二条指令对这些浏览器完全禁用压缩。
第三个`BrowserMatch`指令修正了上面两条对浏览器的推测,因为微软的IE也将它自己标识成"Mozilla/4"但是它实际上能够处理所有的压缩内容。因此又在`User-Agent`头中额外匹配了字符串"MSIE"("`\b`"表示"单词边界"),并且取消了前面的限制。
### 注意
`DEFLATE`过滤器总是在类似于PHP或SSI之类的资源过滤器之后插入,它永远不会触及到内部请求。
### 注意
通过`SetEnv`设置`force-gzip`环境变量将会忽略浏览器的"accept-encoding",始终发送经过压缩的内容。
### 输出解压
`mod_deflate`模块还提供了一个解压gzip格式的应答体的功能。为了激活这个特性你必须使用`SetOutputFilter`或`AddOutputFilter`指令将`INFLATE`过滤器插入到输入过滤器链:
```
<Location /dav-area>
ProxyPass http://example.com/
SetOutputFilter INFLATE
</Location>
```
这个例子将会解压来自example.com的输出,这样其它过滤器就可以做进一步的处理了。
### 输入解压
`mod_deflate`模块还提供了一个解压gzip格式的请求体的功能。为了激活这个特性你必须使用`SetInputFilter`或`AddInputFilter`指令将`DEFLATE`过滤器插入到输入过滤器链。例如:
```
<Location /dav-area>
SetInputFilter DEFLATE
</Location>
```
这样,如果包含"`Content-Encoding: gzip`"头的请求体将会被自动解压。极少有浏览器压缩请求体。然而有些程序的确这么做了,比如一些[WebDAV](http://www.webdav.org)客户端程序。
### 注意 Content-Length
如果你自己处理请求体,请注意`Content-Length`头仅仅表示客户端输入的数据长度,而_不是_解压后的实际数据长度。
## 代理服务器
`mod_deflate`模块发送一个"`Vary: Accept-Encoding`"HTTP应答头以提醒代理服务器:只对发送了正确"`Accept-Encoding`"头的客户端发送缓存的应答。这样可以防止不能正确处理压缩内容的浏览器接受到经过压缩的内容。
如果你按照某些特殊的条件拒绝了某些客户端的访问(比如`User-Agent`头),你必须手动配置一个额外的`Vary`头提醒代理服务器做额外的限制。比如,在一个典型的配置中的某处,如果额外的`DEFLATE`过滤器是否生效取决于`User-Agent`头,你应当在此处添加:
```
Header append Vary User-Agent
```
如果依照除请求头以外的其他条件决定是否使用压缩(例如:HTTP版本),你必须设置`Vary`头的值为"`*`"来完全阻止代理服务器的缓存。
### 示例
```
Header set Vary *
```
## DeflateBufferSize 指令
| [说明](#calibre_link-18) | 用于zlib一次压缩的片断大小(字节) |
| --- | --- |
| [语法](#calibre_link-19) | `DeflateBufferSize value` |
| [默认值](#calibre_link-24) | `DeflateBufferSize 8096` |
| [作用域](#calibre_link-20) | server config, virtual host |
| [状态](#calibre_link-21) | 扩展(E) |
| [模块](#calibre_link-22) | mod_deflate |
`DeflateBufferSize`指令定义了zlib一次压缩的片断的字节数。
## DeflateCompressionLevel 指令
| [说明](#calibre_link-18) | 将输出内容压缩的程度 |
| --- | --- |
| [语法](#calibre_link-19) | `DeflateCompressionLevel value` |
| [默认值](#calibre_link-24) | `Zlib的默认值` |
| [作用域](#calibre_link-20) | server config, virtual host |
| [状态](#calibre_link-21) | 扩展(E) |
| [模块](#calibre_link-22) | mod_deflate |
| [兼容性](#calibre_link-137) | 仅在 Apache 2.0.45 及以后的版本中可用 |
`DeflateCompressionLevel`指令设置压缩程度,越高的压缩程度就会有越好的压缩效果,同时也意味着占用越多的CPU资源。
取值范围在 1(最低压缩率) 到 9(最高压缩率)之间。
## DeflateFilterNote 指令
| [说明](#calibre_link-18) | 在日志中放置压缩率标记 |
| --- | --- |
| [语法](#calibre_link-19) | `DeflateFilterNote [type] notename` |
| [作用域](#calibre_link-20) | server config, virtual host |
| [状态](#calibre_link-21) | 扩展(E) |
| [模块](#calibre_link-22) | mod_deflate |
| [兼容性](#calibre_link-137) | type仅在2.0.45以后版本中可用 |
`DeflateFilterNote`指令指定将一个指示压缩率的标记附加在请求之后。notename就表示这个标记的名字。你可以为了某种统计目的将这个标记的名字添加到[访问日志](#calibre_link-492)中。
### 示例
```
DeflateFilterNote ratio
LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog logs/deflate_log deflate
```
如果你想从日志中得到更多精确的数据,可以使用type参数指定notename标记所记录的数据类型。type的取值范围如下:
`Input`
在标记中存储过滤器输入流的字节数。
`Output`
在标记中存储过滤器输出流的字节数。
`Ratio`
在标记中存储过滤器的压缩比(`输出/输入*100`)。这是type的默认值。
于是,就可以这样记录:
### Accurate Logging
```
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog logs/deflate_log deflate
```
### 参见
* `mod_log_config`
## DeflateMemLevel 指令
| [说明](#calibre_link-18) | zlib在压缩时最多可以使用多少内存 |
| --- | --- |
| [语法](#calibre_link-19) | `DeflateMemLevel value` |
| [默认值](#calibre_link-24) | `DeflateMemLevel 9` |
| [作用域](#calibre_link-20) | server config, virtual host |
| [状态](#calibre_link-21) | 扩展(E) |
| [模块](#calibre_link-22) | mod_deflate |
`DeflateMemLevel`指令指定zlib在压缩时最多可以使用多少内存(取值范围在1到9之间)。
## DeflateWindowSize 指令
| [说明](#calibre_link-18) | Zlib压缩窗口(compression window)的大小 |
| --- | --- |
| [语法](#calibre_link-19) | `DeflateWindowSize value` |
| [默认值](#calibre_link-24) | `DeflateWindowSize 15` |
| [作用域](#calibre_link-20) | server config, virtual host |
| [状态](#calibre_link-21) | 扩展(E) |
| [模块](#calibre_link-22) | mod_deflate |
`DeflateWindowSize`指令设定zlib压缩窗口(compression window)的大小(取值范围在1到15之间)。通常窗口越大压缩效果越好。
- Apache HTTP Server Version 2.2 文档 [最后更新:2006年3月21日]
- 版本说明
- 从1.3升级到2.0
- 从2.0升级到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 参考手册
- 编译与安装
- 启动Apache
- 停止和重启
- 配置文件
- 配置段(容器)
- 缓冲指南
- 服务器全局配置
- 日志文件
- 从URL到文件系统的映射
- 安全方面的提示
- 动态共享对象(DSO)支持
- 内容协商
- 自定义错误响应
- 地址和端口的绑定(Binding)
- 多路处理模块
- Apache的环境变量
- Apache处理器的使用
- 过滤器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重写指南
- Apache虚拟主机文档
- 基于主机名的虚拟主机
- 基于IP地址的虚拟主机
- 大批量虚拟主机的动态配置
- 虚拟主机示例
- 深入研究虚拟主机的匹配
- 文件描述符限制
- 关于DNS和Apache
- 常见问题
- 经常问到的问题
- Apache的SSL/TLS加密
- SSL/TLS高强度加密:绪论
- SSL/TLS高强度加密:兼容性
- SSL/TLS高强度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 认证、授权、访问控制
- CGI动态页面
- 服务器端包含入门
- .htaccess文件
- 用户网站目录
- 针对特定平台的说明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上编译Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服务器和支持程序
- httpd - Apache超文本传输协议服务器
- ab - Apache HTTP服务器性能测试工具
- apachectl - Apache HTTP服务器控制接口
- apxs - Apache 扩展工具
- configure - 配置源代码树
- dbmmanage - 管理DBM格式的用户认证文件
- htcacheclean - 清理磁盘缓冲区
- htdbm - 操作DBM密码数据库
- htdigest - 管理用于摘要认证的用户文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本认证的用户文件
- logresolve - 解析Apache日志中的IP地址为主机名
- rotatelogs - 滚动Apache日志的管道日志程序
- suexec - 在执行外部程序之前切换用户
- 其他程序
- 杂项文档
- 与Apache相关的标准
- Apache模块
- 描述模块的术语
- 描述指令的术语
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模块 mod_actions
- Apache模块 mod_alias
- Apache模块 mod_asis
- Apache模块 mod_auth_basic
- Apache模块 mod_auth_digest
- Apache模块 mod_authn_alias
- Apache模块 mod_authn_anon
- Apache模块 mod_authn_dbd
- Apache模块 mod_authn_dbm
- Apache模块 mod_authn_default
- Apache模块 mod_authn_file
- Apache模块 mod_authnz_ldap
- Apache模块 mod_authz_dbm
- Apache模块 mod_authz_default
- Apache模块 mod_authz_groupfile
- Apache模块 mod_authz_host
- Apache模块 mod_authz_owner
- Apache模块 mod_authz_user
- Apache模块 mod_autoindex
- Apache模块 mod_cache
- Apache模块 mod_cern_meta
- Apache模块 mod_cgi
- Apache模块 mod_cgid
- Apache模块 mod_charset_lite
- Apache模块 mod_dav
- Apache模块 mod_dav_fs
- Apache模块 mod_dav_lock
- Apache模块 mod_dbd
- Apache模块 mod_deflate
- Apache模块 mod_dir
- Apache模块 mod_disk_cache
- Apache模块 mod_dumpio
- Apache模块 mod_echo
- Apache模块 mod_env
- Apache模块 mod_example
- Apache模块 mod_expires
- Apache模块 mod_ext_filter
- Apache模块 mod_file_cache
- Apache模块 mod_filter
- Apache模块 mod_headers
- Apache模块 mod_ident
- Apache模块 mod_imagemap
- Apache模块 mod_include
- Apache模块 mod_info
- Apache模块 mod_isapi
- Apache模块 mod_ldap
- Apache模块 mod_log_config
- Apache模块 mod_log_forensic
- Apache模块 mod_logio
- Apache模块 mod_mem_cache
- Apache模块 mod_mime
- Apache模块 mod_mime_magic
- Apache模块 mod_negotiation
- Apache模块 mod_nw_ssl
- Apache模块 mod_proxy
- Apache模块 mod_proxy_ajp
- Apache模块 mod_proxy_balancer
- Apache模块 mod_proxy_connect
- Apache模块 mod_proxy_ftp
- Apache模块 mod_proxy_http
- Apache模块 mod_rewrite
- Apache模块 mod_setenvif
- Apache模块 mod_so
- Apache模块 mod_speling
- Apache模块 mod_ssl
- Apache模块 mod_status
- Apache模块 mod_suexec
- Apache模块 mod_unique_id
- Apache模块 mod_userdir
- Apache模块 mod_usertrack
- Apache模块 mod_version
- Apache模块 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 词汇和索引
- 词汇表
- 指令索引
- 指令速查
- 模块索引
- 站点导航