Apache HTTP 伺服器版本 2.4
說明 | 在內容傳送至用戶端前,透過 Brotli 壓縮內容 |
---|---|
狀態 | 擴充套件 |
模組識別碼 | brotli_module |
原始檔 | mod_brotli.c |
相容性 | 於版本 2.4.26 和後續版本中使用。 |
mod_brotli
模組提供 BROTLI_COMPRESS
輸出篩選器,讓伺服器輸出在透過網路傳送至用戶端前,得以使用 brotli 壓縮格式進行壓縮。此模組使用於 https://github.com/google/brotli 所提供的 Brotli 函式庫。
當 TLS 連線含有壓縮資料時,一些網頁應用程式容易受到資訊揭露攻擊。有關更多資訊,請查看「BREACH」系列攻擊的詳細資料。
這是壓縮一般文字型內容類型的簡單組態。
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/javascript
當 TLS 連線含有壓縮資料時,一些網頁應用程式容易受到資訊揭露攻擊。有關更多資訊,請查看「BREACH」系列攻擊的詳細資料。
壓縮由 BROTLI_COMPRESS
篩選器 來實作。下列指令將針對放置於其容器中的文件啟用壓縮
SetOutputFilter BROTLI_COMPRESS SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-brotli
如果您想將壓縮限制於一般中特定 MIME 類型,則可以使用 AddOutputFilterByType
指令。以下為 Apache 文件僅針對 html 檔案啟用壓縮範例
<Directory "/your-server-root/manual"> AddOutputFilterByType BROTLI_COMPRESS text/html </Directory>
BROTLI_COMPRESS
篩選器始終會套用在 PHP 或是 SSI 等資源篩選器後。且從來不會觸發內部子請求。mod_brotli
模組會傳送一個 Vary: Accept-Encoding
HTTP 回應標頭,以提醒代理伺服器,快取的回應應僅傳送給傳送適當的 Accept-Encoding
要求標頭的用戶端。這可避免將壓縮內容傳送給無法理解的用戶端。
如果您使用一些特殊的排除項(例如,視 User-Agent
標頭而定),您必須手動設定加入 Vary
標頭,以提醒代理伺服器有其他限制。例如,在一個典型的組態中,其中 BROTLI_COMPRESS
濾器的加入視 User-Agent
而定,您應加入
Header append Vary User-Agent
如果您的壓縮決定視要求標頭之外的其他資訊(例如,HTTP 版本),則您必須將 Vary
標頭設定為 *
。這會避免相容性代理伺服器完全快取。
Header set Vary *
由於 mod_brotli
會在每次提出要求時重新壓縮內容,因此可以透過預先壓縮內容,並指示 mod_brotli 在不重新壓縮它們的情況下提供它們,來獲得一些效能優勢。這可以使用類似下列的組態來達成
<IfModule mod_headers.c> # Serve brotli compressed CSS files if they exist # and the client accepts brotli. RewriteCond "%{HTTP:Accept-encoding}" "br" RewriteCond "%{REQUEST_FILENAME}\.br" "-s" RewriteRule "^(.*)\.css" "$1\.css\.br" [QSA] # Serve brotli compressed JS files if they exist # and the client accepts brotli. RewriteCond "%{HTTP:Accept-encoding}" "br" RewriteCond "%{REQUEST_FILENAME}\.br" "-s" RewriteRule "^(.*)\.js" "$1\.js\.br" [QSA] # Serve correct content types, and prevent double compression. RewriteRule "\.css\.br$" "-" [T=text/css,E=no-brotli:1] RewriteRule "\.js\.br$" "-" [T=text/javascript,E=no-brotli:1] <FilesMatch "(\.js\.br|\.css\.br)$"> # Serve correct encoding type. Header append Content-Encoding br # Force proxies to cache brotli & # non-brotli css/js files separately. Header append Vary Accept-Encoding </FilesMatch> </IfModule>
說明 | 壓縮期間如何修改傳出 ETag 標頭 |
---|---|
語法 | BrotliAlterETag AddSuffix|NoChange|Remove |
預設值 | BrotliAlterETag AddSuffix |
內容 | 伺服器組態、虛擬主機 |
狀態 | 擴充套件 |
模組 | mod_brotli |
BrotliAlterETag
指令會指定回應被壓縮時應如何變更 ETag 標頭。
將壓縮方法附加到 ETag 的結尾,導致壓縮和未壓縮的表示形式具有唯一的 ETag。在另一個動態壓縮模組 mod_deflate 中,這已成為 2.4.0 以來的預設值。此設定可避免向壓縮內容的條件請求提供「HTTP Not Modified」(304) 回應。
不要變更壓縮回應的 ETag。在另一個動態壓縮模組 mod_deflate 中,這已成為 2.4.0 之前的預設值。此設定不符合 HTTP/1.1 屬性,即同一資源的所有表示形式都具有唯一的 ETag。
從壓縮回應移除 ETag 標頭。這可避免執行一些條件請求,但可避免前述選項的缺點。
說明 | 最大輸入區塊大小 |
---|---|
語法 | BrotliCompressionMaxInputBlock value |
預設值 | (自動) |
內容 | 伺服器組態、虛擬主機 |
狀態 | 擴充套件 |
模組 | mod_brotli |
指令 BrotliCompressionMaxInputBlock
指定最大輸入區塊大小介於 16 至 24,但要注意的是,區塊大小越大,所需記憶體越多。
說明 | 壓縮品質 |
---|---|
語法 | BrotliCompressionQuality value |
預設值 | BrotliCompressionQuality 5 |
內容 | 伺服器組態、虛擬主機 |
狀態 | 擴充套件 |
模組 | mod_brotli |
指令 BrotliCompressionQuality
指定壓縮品質(0 至 11 之間的值)。品質值越高,壓縮品質越好,但速度也越慢。
說明 | Brotli 壓縮視窗大小滑動 |
---|---|
語法 | BrotliCompressionWindow value |
預設值 | BrotliCompressionWindow 18 |
內容 | 伺服器組態、虛擬主機 |
狀態 | 擴充套件 |
模組 | mod_brotli |
指令 BrotliCompressionWindow
指定 brotli 壓縮視窗大小滑動(10 至 24 之間的值)。視窗大小越大,壓縮品質可能越好,但所需記憶體也越多。
說明 | 將壓縮比放置在備忘錄中以供記錄 |
---|---|
語法 | BrotliFilterNote [type] notename |
內容 | 伺服器組態、虛擬主機 |
狀態 | 擴充套件 |
模組 | mod_brotli |
指令 BrotliFilterNote
指定應將壓縮比的備忘錄附加至請求中。備忘錄的名稱是為此指令指定的值。您可以將值加入 存取記錄檔 中,以統計用途使用該備忘錄。
BrotliFilterNote ratio LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' brotli CustomLog "logs/brotli_log" brotli
如果您想從記錄檔中擷取更準確的值,可以使用 type 引數指定要作為備忘錄中記錄的資料類型。 type 可以是下列選項之一
Input
Output
Ratio
output/input * 100
) 儲存在備忘錄中。如果省略 type 引數,則此為預設值。因此,您可以用這種方式記錄
BrotliFilterNote Input instream BrotliFilterNote Output outstream BrotliFilterNote Ratio ratio LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' brotli CustomLog "logs/brotli_log" brotli