提供壓縮檔案 - Amazon CloudFront

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

提供壓縮檔案

請求的物件壓縮後物件較小,下載更快 – 在某些情況下,壓縮後還不到原始檔案的四分之一大小。更快速的下載可以為您的瀏覽者更快轉譯網頁,尤其是 JavaScript 和 CSS 檔案。此外,CloudFront 資料傳輸的成本是根據服務的總資料量。提供壓縮物件的成本可能低於未壓縮的物件。

設定 CloudFront 壓縮物件

若要設定 CloudFront 壓縮物件,請更新您要提供壓縮物件的快取行為。

設定 CloudFront 壓縮物件 (主控台)
  1. 登入 CloudFront 主控台

  2. 選擇您的分佈,然後選擇要編輯的行為

  3. 針對自動設定的壓縮物件,選擇

  4. 使用快取政策來指定快取設定,並啟用 GzipBrotli 壓縮格式。

  5. 將快取政策中的 TTL 設定設為大於零的值。如果您將最短 TTL值設定為零,CloudFront 不會快取壓縮的內容。

備註
  • 您必須使用快取政策來使用 Brotli 壓縮。Brotli 不支援舊版快取設定。

  • 若要使用 AWS CloudFormationCloudFront API 啟用壓縮,請將 CompressEnableAcceptEncodingGzipEnableAcceptEncodingBrotli 參數設定為 true

若要了解 CloudFront 如何壓縮物件,請參閱下一節。

CloudFront 壓縮如何運作

  1. 一個檢視器請求了一個物件。檢視器會在請求中包含 Accept-Encoding HTTP 標頭,而標頭值則包含 gzipbr 或兩者。這表示檢視器支援壓縮物件。當檢視器同時支援 Gzip 和 Brotli 時,CloudFront 會使用 Brotli。

    注意

    Chrome 和 Firefox Web 瀏覽器僅在使用 HTTPS 傳送請求時支援 Brotli 壓縮。它們不支援具有 HTTP 請求的 Brotli。

  2. 在節點,CloudFront 會檢查快取中是否有所請求物件的壓縮副本。

  3. 根據壓縮的物件是否在快取中,CloudFront 會執行下列其中一項操作:

    • 如果壓縮的物件已在快取中,CloudFront 會將物件傳送給檢視器,並略過剩餘的步驟。

    • 如果壓縮的物件不在快取中,CloudFront 會將請求轉送到原始伺服器。

    注意

    如果物件的未壓縮副本已存在於快取中,CloudFront 會將該物件傳送至檢視器,而不會將請求轉送至原始伺服器。舉例來說,如果 CloudFront 先前略過壓縮作業,就會發生這種情況。發生這種情況時,CloudFront 會快取未壓縮的物件並繼續提供物件,直到物件過期、移出或無效為止。

  4. 如果原始伺服器傳回壓縮的物件 (如 HTTP 回應中的 Content-Encoding標頭所示),CloudFront 會將壓縮的物件傳送給檢視器,將其新增至快取,並略過剩餘的步驟。CloudFront 不會再次壓縮物件。

  5. 如果原始伺服器傳回未壓縮的物件到 CloudFront,而 HTTP 回應中沒有 Content-Encoding標頭,則 CloudFront 會決定是否可以壓縮物件。如需詳細資訊,請參閱當 CloudFront 壓縮物件時

  6. 如果物件可以壓縮,CloudFront 會壓縮物件、將其傳送給檢視器,然後將其新增至快取。

  7. 如果有相同物件的後續瀏覽者請求,CloudFront 會傳回第一個快取版本。例如,如果檢視器請求使用 Gzip 壓縮的特定快取物件,且檢視器接受 Gzip 格式,則對相同物件的後續請求一律會傳回 Gzip 版本,即使檢視器同時接受 Brotli 和 Gzip。

某些自訂原始伺服器也可以壓縮物件。您的原始伺服器可能可以壓縮 CloudFront 未壓縮的物件。如需詳細資訊,請參閱CloudFront 壓縮的檔案類型

當 CloudFront 壓縮物件時

下列清單提供有關 CloudFront 何時會壓縮物件的詳細資訊。

請求使用 HTTP 1.0

如果對 CloudFront 的請求使用 HTTP 1.0,CloudFront 會移除 Accept-Encoding標頭,而不會壓縮回應中的物件。

Accept-Encoding 請求標頭

如果瀏覽者請求中缺少 Accept-Encoding標頭,或者它不包含 gzipbr作為值,CloudFront 不會壓縮回應中的物件。如果 Accept-Encoding 標頭包含額外的值,例如 deflate,則 CloudFront 在將請求轉送到原始伺服器之前會先移除這些值。

當 CloudFront 設定為壓縮物件時,它會在快取金鑰中和原始伺服器請求中自動包含 Accept-Encoding 標頭。

當您設定 CloudFront 來壓縮物件時,內容已快取

CloudFront 會在從原始伺服器取得物件時壓縮物件。當您設定 CloudFront 來壓縮物件時,CloudFront 不會壓縮已在節點快取的物件。此外,當快取的物件在節點過期,且 CloudFront 將物件的另一個請求轉送到原始伺服器時,CloudFront 不會在原始伺服器傳回 HTTP 狀態碼 304 時壓縮物件。這表示節點已有最新版本的物件。如果您想讓 CloudFront 壓縮已在節點快取的物件,您必須讓這些物件失效。如需詳細資訊,請參閱 使檔案失效以移除內容

已配置原始伺服器來壓縮物件

如果您設定 CloudFront 壓縮物件,且原始伺服器也壓縮物件,則原始伺服器應包含 Content-Encoding標頭。此標頭會向 CloudFront 指出物件已壓縮。當原始伺服器的回應包含 Content-Encoding標頭時,CloudFront 不會壓縮物件,無論標頭的值為何。CloudFront 會將回應傳送給檢視器,並且在節點快取物件。

CloudFront 壓縮的檔案類型

如需完整清單,請參閱 CloudFront 壓縮的檔案類型

CloudFront 壓縮的物件大小

CloudFront 壓縮的物件大小介於 1,000 個位元組到 10,000,000 個位元組之間。

Content-Length 標頭

原始伺服器必須在回應中包含 Content-Length 標頭,以便 CloudFront 判斷物件的大小是否在 CloudFront 壓縮的範圍內。如果Content-Length標頭遺失、包含無效值,或包含超出 CloudFront 壓縮大小範圍的值,CloudFront 不會壓縮物件。如需 CloudFront 如何處理可能超過大小範圍之大型物件的詳細資訊,請參閱 CloudFront 如何處理物件的部分請求 (範圍 GET)

回應的 HTTP 狀態碼

只有在回應的 HTTP 狀態碼為 200403404 時,CloudFront 才會壓縮物件。

回應沒有內文

當來自原始伺服器的 HTTP 回應沒有內文時,CloudFront 沒有可以壓縮的內容。

ETag 標頭

CloudFront 有時會在壓縮物件時修改 HTTP 回應中的 ETag 標頭。如需詳細資訊,請參閱ETag 標頭轉換

CloudFront 略過壓縮作業

CloudFront 一般會盡力壓縮物件,在極少數情況下,CloudFront 會在 CloudFront 遇到高流量負載時略過壓縮物件。CloudFront 會根據多種因素 (包括主機容量) 決定是否略過壓縮作業。CloudFront 略過物件的壓縮作業時,會快取未壓縮物件並繼續將物件提供給檢視者,直到物件過期、移出或失效為止。

CloudFront 壓縮的檔案類型

如果您設定 CloudFront 來壓縮物件,則 CloudFront 僅會壓縮 Content-Type 回應標頭中具有下列值的物件:

  • application/dash+xml

  • application/eot

  • application/font

  • application/font-sfnt

  • application/javascript

  • application/json

  • application/opentype

  • application/otf

  • application/pdf

  • application/pkcs7-mime

  • application/protobuf

  • application/rss+xml

  • application/truetype

  • application/ttf

  • application/vnd.apple.mpegurl

  • application/vnd.mapbox-vector-tile

  • application/vnd.ms-fontobject

  • application/wasm

  • application/xhtml+xml

  • application/xml

  • application/x-font-opentype

  • application/x-font-truetype

  • application/x-font-ttf

  • application/x-httpd-cgi

  • application/x-javascript

  • application/x-mpegurl

  • application/x-opentype

  • application/x-otf

  • application/x-perl

  • application/x-ttf

  • font/eot

  • font/opentype

  • font/otf

  • font/ttf

  • image/svg+xml

  • text/css

  • text/csv

  • text/html

  • text/javascript

  • text/js

  • text/plain

  • text/richtext

  • text/tab-separated-values

  • text/xml

  • text/x-component

  • text/x-java-source

  • text/x-script

  • vnd.apple.mpegurl

ETag 標頭轉換

如果來自原始伺服器的未壓縮物件包含有效的強 ETag HTTP 標頭,CloudFront 壓縮該物件時,CloudFront 會將強 ETag 標頭值轉換為弱 ETag,並將弱 ETag 值傳回給檢視器。檢視器可以儲存弱值 ETag,並使用它來傳送具有 If-None-Match HTTP 標頭的條件式請求。這可讓檢視器 CloudFront 和原始伺服器將物件的壓縮和未壓縮版本視為語義上等效的物件,從而減少不必要的資料傳輸。

有效的強ETag標頭值以雙引號字元 () 開頭和結尾"。若要將強值 ETag 轉換為弱值,CloudFront 會將字元 W/ 新增至強值 ETag 的開頭。

當來自原始伺服器的物件包含弱標頭值 ETag (以字元 W/ 開頭的值) 時,CloudFront 不會修改此值,而是按照從原始伺服器接收的原樣傳回給檢視器。

當原始伺服器的物件包含無效的 ETag 標頭值 (非以 "W/ 開頭的值) 時,CloudFront 會移除 ETag 標頭,並將不含 ETag 回應標頭的物件傳回給檢視器。

如需詳細資訊,請參閱 MDN Web 文件中的下列頁面: