<-
Apache > HTTP Server > 文件 > 2.4 版 > 模組

Apache 模組 mod_deflate

支援語言:  en  |  fr  |  ja  |  ko 

說明在內容傳送至用戶端之前壓縮內容
狀態延伸模組
模組識別碼deflate_module
來源檔案mod_deflate.c

摘要

mod_deflate 模組提供 DEFLATE 輸出篩選器,可將伺服器輸出的資料壓縮,再透過網路傳送給用戶端。

Support Apache!

主題

指令

錯誤修正清單

另請參閱

top

支援編碼

gzip 編碼為唯一支援編碼,以確保與舊版瀏覽器實作完全相容。deflate 編碼不受支援,請參閱 zlib 文件 以取得完整說明。

top

建議設定

壓縮與 TLS

當 TLS 連線傳送 deflate 壓縮資料時,一些網路應用程式可能會發生資訊揭露攻擊。若要取得詳細資訊,請檢閱「BREACH」系列攻擊的相關說明。

這是一個簡單的設定檔,可以壓縮常見的文字內容類型。

僅壓縮幾種類型

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
top

啟用壓縮

壓縮與 TLS

當 TLS 連線傳送 deflate 壓縮資料時,一些網路應用程式可能會發生資訊揭露攻擊。若要取得詳細資訊,請檢閱「BREACH」系列攻擊的相關說明。

輸出壓縮

壓縮是由 DEFLATE 篩選器 所實作的。下列指令將會為放置容器中的文件啟用壓縮

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip

如果您想要限制壓縮到特定的 MIME 類型,您可以使用 AddOutputFilterByType 指令。以下是僅對 Apache 文件的 html 檔案啟用壓縮的範例

<Directory "/your-server-root/manual">
    AddOutputFilterByType DEFLATE text/html
</Directory>

注意

DEFLATE 篩選器會在 PHP 或 SSI 等資源篩選器之後嵌入。它不會影響內部二次請求。

注意

有一個環境變數 force-gzip,可以透過 SetEnv 來設定,用來忽略瀏覽器的接受編碼設定,並且會傳送壓縮輸出。

輸出解壓縮

mod_deflate 模組同時也提供了用來膨脹/解壓縮 gzip 壓縮回應主體的篩選器。為了啟用這項功能,您必須使用 SetOutputFilterAddOutputFilterINFLATE 篩選器插入輸出篩選器串,例如

<Location "/dav-area">
    ProxyPass "http://example.com/"
    SetOutputFilter INFLATE
</Location>

此範例將會解壓縮來自 example.com 的 gzip 輸出,因此其他篩選器可以使用它來進行後續處理。

輸入解壓縮

mod_deflate 模組同時也提供了用來解壓縮 gzip 壓縮請求主體的篩選器。為了啟用這項功能,您必須使用 SetInputFilterAddInputFilterDEFLATE 篩選器插入輸入篩選器串中,例如

<Location "/dav-area">
    SetInputFilter DEFLATE
</Location>

現在如果請求包含 Content-Encoding: gzip 標頭,主體將會自動解壓縮。只有少數瀏覽器具有 gzip 請求主體的能力。然而,有些特殊的應用程式會支援請求壓縮,例如一些 WebDAV 軟體。

關於內容長度

如果您親自評估請求主體,請不要相信 Content-Length 標頭! Content-Length 標頭反映的是來自用戶端的資料長度而非解壓縮後資料串的位元組數。

top

處理代理伺服器

mod_deflate 模組會傳送 Vary: Accept-Encoding HTTP 回應標頭來提醒代理伺服器,僅針對傳送適當 Accept-Encoding 請求標頭的用戶端傳送快取回應。這會避免將壓縮內容傳送給無法理解內容的用戶端。

如果你使用一些特殊的排除,例如,基於 User-Agent 標頭,你必須手動設定一個加入到 Vary 標頭中,來警告代理伺服器其他限制。例如,在典型的設定中,加上 DEFLATE 濾器是取決於 User-Agent,你應該加上

Header append Vary User-Agent

如果你關於壓縮的決策取決於請求標頭之外的其他資訊(例如 HTTP 版本),你必須設定 Vary 標頭為值 *。這會防止相容的代理伺服器完全快取。

範例

Header set Vary *
top

服務預先壓縮的內容

由於 mod_deflate 在每次建立請求時會重新壓縮內容,預先壓縮內容並告訴 mod_deflate 在不重新壓縮的情況下提供這些內容,可以得到一些效能上的提升。這可以使用下方的設定來達成

<IfModule mod_headers.c>
    # Serve gzip compressed CSS and JS files if they exist
    # and the client accepts gzip.
    RewriteCond "%{HTTP:Accept-encoding}" "gzip"
    RewriteCond "%{REQUEST_FILENAME}\.gz" -s
    RewriteRule "^(.*)\.(css|js)"         "$1\.$2\.gz" [QSA]

    # Serve correct content types, and prevent mod_deflate double gzip.
    RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
    RewriteRule "\.js\.gz$"  "-" [T=text/javascript,E=no-gzip:1]


    <FilesMatch "(\.js\.gz|\.css\.gz)$">
      # Serve correct encoding type.
      Header append Content-Encoding gzip

      # Force proxies to cache gzipped &
      # non-gzipped css/js files separately.
      Header append Vary Accept-Encoding
    </FilesMatch>
</IfModule>
top

DeflateAlterETag 指令

說明在壓縮期間外送 ETag 標頭應該如何修改
語法DeflateAlterETag AddSuffix|NoChange|Remove
預設值DeflateAlterETag AddSuffix
上下文伺服器設定,虛擬主機
狀態延伸模組
模組mod_deflate
相容性在 Apache 2.4.58 及之後的版本中可用

當一個回應被壓縮時,DeflateAlterETag 指令會指定如何變更 ETag 標頭。

AddSuffix

將壓縮方法附加到 ETag 的結尾,造成壓縮和未壓縮的表徵有獨特的 ETag。這是 2.4.0 以來的預設值,但會防止為壓縮內容的條件式請求提供「HTTP 未修改」(304) 回應。

NoChange

在壓縮回應中不要變更 ETag。這是 2.4.0 之前的預設值,但是不符合 HTTP/1.1 屬性,即相同資源的所有表徵有唯一的 ETag。

Remove

從壓縮回應中移除 ETag 標頭。這會防止一些條件式請求成為可能,但是會避免前面選項的缺點。

top

DeflateBufferSize 指令

說明zlib 每一次要壓縮的片段大小
語法DeflateBufferSize
預設值DeflateBufferSize 8096
上下文伺服器設定,虛擬主機
狀態延伸模組
模組mod_deflate

指令 DeflateBufferSize 指定 zlib 一次壓縮的片段大小(以位元組為單位)。如果壓縮的回應大小大於此指令指定的數值,httpd 將切換至區塊編碼(HTTP 標頭 Transfer-Encoding 設定為 Chunked),但相應的副作用是不設定任何 Content-Length HTTP 標頭。當 httpd 在反向快取代理伺服器的後方執行,或 httpd 設定為搭配 mod_cachemod_cache_disk 時,這個情況格外重要,因為沒有 Content-Length 標頭的 HTTP 回應可能無法快取。

top

DeflateCompressionLevel 指令

說明對輸出套用多少壓縮
語法DeflateCompressionLevel
預設值Zlib 預設值
上下文伺服器設定,虛擬主機
狀態延伸模組
模組mod_deflate

指令 DeflateCompressionLevel 指定應使用的壓縮等級,數值越大,壓縮率越高,但所需的 CPU 時間也會越長。

數值必須從 1(壓縮率較低)到 9(壓縮率較高)。

top

DeflateFilterNote 指令

說明將壓縮比放置在備忘錄中以進行記錄
語法DeflateFilterNote [類型] 備忘錄名稱
上下文伺服器設定,虛擬主機
狀態延伸模組
模組mod_deflate

指令 DeflateFilterNote 指定應附註壓縮比的備忘錄至要求。備忘錄的名稱是為指令指定的數值。您可以透過將數值新增至 存取記錄,在備忘錄中加入統計目的資訊。

範例

DeflateFilterNote ratio

LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog "logs/deflate_log" deflate

如果您想從記錄中擷取更精確的數值,您可以使用 類型 參數,指定作為記錄備忘錄的資料類型。類型 可以是下列其中一項:

Input
在備忘錄中儲存濾鏡輸入串流的位元組計數。
Output
在備忘錄中儲存濾鏡輸出串流的位元組計數。
Ratio
在備忘錄中儲存壓縮比(輸出/輸入 * 100)。這是預設值,如果略過了 類型 參數。

因此您可以用下列方式進行記錄

精確的記錄

DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio

LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog "logs/deflate_log" deflate

另請參閱

top

DeflateInflateLimitRequestBody 指令

說明膨脹要求主體的最大大小
語法DeflateInflateLimitRequestBody
預設值無,但 Deflate 之後仍會套用 LimitRequestBody
上下文伺服器組態、虛擬主機、目錄、.htaccess
狀態延伸模組
模組mod_deflate
相容性2.4.10 和更新版本

指令 DeflateInflateLimitRequestBody 指定膨脹要求主體的最大大小。如果未設定,即會將 LimitRequestBody 套用至膨脹的主體。

top

DeflateInflateRatioBurst 指令

說明請求本文膨脹率可被超越的最大次數
語法DeflateInflateRatioBurst
預設值DeflateInflateRatioBurst 3
上下文伺服器組態、虛擬主機、目錄、.htaccess
狀態延伸模組
模組mod_deflate
相容性2.4.10 和更新版本

DeflateInflateRatioBurst 指令指定在終止請求之前,DeflateInflateRatioLimit 可被超越的最大次數

top

DeflateInflateRatioLimit 指令

說明請求本文的最大膨脹率
語法DeflateInflateRatioLimit
預設值DeflateInflateRatioLimit 200
上下文伺服器組態、虛擬主機、目錄、.htaccess
狀態延伸模組
模組mod_deflate
相容性2.4.10 和更新版本

DeflateInflateRatioLimit 指令指定膨脹的請求本文的縮放與膨脹大小的最大比率。此比率會在串流本文時檢查,如果超過 DeflateInflateRatioBurst 次數,請求便會終止

top

DeflateMemLevel 指令

說明用於壓縮的 zlib 記憶體用量
語法DeflateMemLevel
預設值DeflateMemLevel 9
上下文伺服器設定,虛擬主機
狀態延伸模組
模組mod_deflate

DeflateMemLevel 指令指定用於壓縮的 zlib 記憶體用量(值介於 1 至 9 之間)

top

DeflateWindowSize 指令

說明zlib 壓縮視窗大小
語法DeflateWindowSize
預設值DeflateWindowSize 15
上下文伺服器設定,虛擬主機
狀態延伸模組
模組mod_deflate

DeflateWindowSize 指令指定 zlib 壓縮視窗大小(值介於 1 至 15 之間)。通常,視窗大小越高,可預期的壓縮比率越高

支援語言:  en  |  fr  |  ja  |  ko 

top

留言

注意事項
此處不是問答區段。置放於此處的意見應該針對改善文件或伺服器的建議,我們的版主可能會在意見被實作或視為無效/離題時移除這些意見。有關如何管理 Apache HTTP 伺服器的問題應導向我們的 IRC 頻道「#httpd」於 Libera.chat,或透過電子郵件寄送至我們的 郵件列表