Apache HTTP Server 2.4 版
說明 | 在內容傳送至用戶端之前壓縮內容 |
---|---|
狀態 | 延伸模組 |
模組識別碼 | deflate_module |
來源檔案 | mod_deflate.c |
mod_deflate
模組提供 DEFLATE
輸出篩選器,可將伺服器輸出的資料壓縮,再透過網路傳送給用戶端。
當 TLS 連線傳送 deflate 壓縮資料時,一些網路應用程式可能會發生資訊揭露攻擊。若要取得詳細資訊,請檢閱「BREACH」系列攻擊的相關說明。
這是一個簡單的設定檔,可以壓縮常見的文字內容類型。
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
當 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 等資源篩選器之後嵌入。它不會影響內部二次請求。
模組同時也提供了用來膨脹/解壓縮 gzip 壓縮回應主體的篩選器。為了啟用這項功能,您必須使用 mod_deflate
SetOutputFilter
或 AddOutputFilter
將 INFLATE
篩選器插入輸出篩選器串,例如
<Location "/dav-area"> ProxyPass "http://example.com/" SetOutputFilter INFLATE </Location>
此範例將會解壓縮來自 example.com 的 gzip 輸出,因此其他篩選器可以使用它來進行後續處理。
模組同時也提供了用來解壓縮 gzip 壓縮請求主體的篩選器。為了啟用這項功能,您必須使用 mod_deflate
SetInputFilter
或 AddInputFilter
將 DEFLATE
篩選器插入輸入篩選器串中,例如
<Location "/dav-area"> SetInputFilter DEFLATE </Location>
現在如果請求包含 Content-Encoding: gzip
標頭,主體將會自動解壓縮。只有少數瀏覽器具有 gzip 請求主體的能力。然而,有些特殊的應用程式會支援請求壓縮,例如一些 WebDAV 軟體。
如果您親自評估請求主體,請不要相信 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 *
由於 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>
說明 | 在壓縮期間外送 ETag 標頭應該如何修改 |
---|---|
語法 | DeflateAlterETag AddSuffix|NoChange|Remove |
預設值 | DeflateAlterETag AddSuffix |
上下文 | 伺服器設定,虛擬主機 |
狀態 | 延伸模組 |
模組 | mod_deflate |
相容性 | 在 Apache 2.4.58 及之後的版本中可用 |
當一個回應被壓縮時,DeflateAlterETag
指令會指定如何變更 ETag 標頭。
將壓縮方法附加到 ETag 的結尾,造成壓縮和未壓縮的表徵有獨特的 ETag。這是 2.4.0 以來的預設值,但會防止為壓縮內容的條件式請求提供「HTTP 未修改」(304) 回應。
在壓縮回應中不要變更 ETag。這是 2.4.0 之前的預設值,但是不符合 HTTP/1.1 屬性,即相同資源的所有表徵有唯一的 ETag。
從壓縮回應中移除 ETag 標頭。這會防止一些條件式請求成為可能,但是會避免前面選項的缺點。
說明 | zlib 每一次要壓縮的片段大小 |
---|---|
語法 | DeflateBufferSize 值 |
預設值 | DeflateBufferSize 8096 |
上下文 | 伺服器設定,虛擬主機 |
狀態 | 延伸模組 |
模組 | mod_deflate |
指令 DeflateBufferSize
指定 zlib 一次壓縮的片段大小(以位元組為單位)。如果壓縮的回應大小大於此指令指定的數值,httpd 將切換至區塊編碼(HTTP 標頭 Transfer-Encoding
設定為 Chunked
),但相應的副作用是不設定任何 Content-Length
HTTP 標頭。當 httpd 在反向快取代理伺服器的後方執行,或 httpd 設定為搭配 mod_cache
和 mod_cache_disk
時,這個情況格外重要,因為沒有 Content-Length
標頭的 HTTP 回應可能無法快取。
說明 | 對輸出套用多少壓縮 |
---|---|
語法 | DeflateCompressionLevel 值 |
預設值 | Zlib 預設值 |
上下文 | 伺服器設定,虛擬主機 |
狀態 | 延伸模組 |
模組 | mod_deflate |
指令 DeflateCompressionLevel
指定應使用的壓縮等級,數值越大,壓縮率越高,但所需的 CPU 時間也會越長。
數值必須從 1(壓縮率較低)到 9(壓縮率較高)。
說明 | 將壓縮比放置在備忘錄中以進行記錄 |
---|---|
語法 | 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
說明 | 膨脹要求主體的最大大小 |
---|---|
語法 | DeflateInflateLimitRequestBody 值 |
預設值 | 無,但 Deflate 之後仍會套用 LimitRequestBody |
上下文 | 伺服器組態、虛擬主機、目錄、.htaccess |
狀態 | 延伸模組 |
模組 | mod_deflate |
相容性 | 2.4.10 和更新版本 |
指令 DeflateInflateLimitRequestBody
指定膨脹要求主體的最大大小。如果未設定,即會將 LimitRequestBody
套用至膨脹的主體。
說明 | 請求本文膨脹率可被超越的最大次數 |
---|---|
語法 | DeflateInflateRatioBurst 值 |
預設值 | DeflateInflateRatioBurst 3 |
上下文 | 伺服器組態、虛擬主機、目錄、.htaccess |
狀態 | 延伸模組 |
模組 | mod_deflate |
相容性 | 2.4.10 和更新版本 |
DeflateInflateRatioBurst
指令指定在終止請求之前,DeflateInflateRatioLimit
可被超越的最大次數
說明 | 請求本文的最大膨脹率 |
---|---|
語法 | DeflateInflateRatioLimit 值 |
預設值 | DeflateInflateRatioLimit 200 |
上下文 | 伺服器組態、虛擬主機、目錄、.htaccess |
狀態 | 延伸模組 |
模組 | mod_deflate |
相容性 | 2.4.10 和更新版本 |
DeflateInflateRatioLimit
指令指定膨脹的請求本文的縮放與膨脹大小的最大比率。此比率會在串流本文時檢查,如果超過 DeflateInflateRatioBurst
次數,請求便會終止