# 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
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航