提供壓縮檔案 - Amazon CloudFront

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

提供壓縮檔案

您可以使用 CloudFront 自動壓縮特定類型的物件 (檔案),並在檢視者 (網頁瀏覽器或其他用戶端) 支援壓縮物件時提供這些物件。檢視器會指示他們對具有 Accept-Encoding HTTP 標頭的壓縮物件的支援。

CloudFront 可以使用 Gzip 和 Brotli 壓縮格式壓縮物件。當檢視器支援兩種格式,且兩者都存在於到達的快取伺服器中時,則 CloudFront 會偏好 Brotli。如果快取伺服器中只有一個壓縮格式, 會 CloudFront 傳回它。

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

注意

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

請求的物件壓縮後物件較小,下載更快 – 在某些情況下,壓縮後還不到原始檔案的四分之一大小。特別是對於 JavaScript 和 CSS 檔案,更快的下載可能會導致您的使用者更快轉譯網頁。此外,由於 CloudFront 資料傳輸的成本是以服務的資料總量為基礎,因此提供壓縮物件的成本可能低於未壓縮物件。

某些自訂原始伺服器也可以壓縮物件。您的原始伺服器可能可以壓縮 CloudFront 未壓縮的物件 (請參閱 CloudFront 壓縮的檔案類型)。如果您的原始伺服器將壓縮的物件傳回 CloudFront, 會根據Content-Encoding標頭的存在 CloudFront 偵測物件已壓縮,且不會再次壓縮物件。

設定 CloudFront 以壓縮物件

若要設定 CloudFront 來壓縮物件,請執行下列所有動作,更新您要提供壓縮物件的快取行為:

  1. 確定 Compress Objects Automatically (自動壓縮物件) 設定為 Yes (是)。(在 AWS CloudFormation 或 中 CloudFront API,Compress設定為 true。)

  2. 使用快取政策來指定快取設定,並確保 GzipBrotli 設定皆已啟用。(在 AWS CloudFormation 或 中 CloudFrontAPI,將 EnableAcceptEncodingGzipEnableAcceptEncodingBrotli設定為 true。)

  3. 請確定快取政策中的TTL值設定為大於零的值。當您將TTL值設定為零時,壓縮內容的快取會停用。

若要更新快取行為,您可以使用下列任何工具:

CloudFront 壓縮的運作方式

當您設定 CloudFront 壓縮物件時 (請參閱上一節),其運作方式如下:

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

    注意

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

  2. 在邊緣位置, 會 CloudFront 檢查快取是否有所請求物件的壓縮複本。

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

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

    注意

    如果物件的未壓縮複本已存在於快取中, CloudFront 則無需將請求轉送至原始伺服器,即可將其傳送至檢視器。例如,當 CloudFront 先前略過壓縮 時,可能會發生這種情況。發生這種情況時, 會 CloudFront 快取未壓縮的物件,並繼續提供服務,直到物件過期、被移出或失效為止。

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

    如果原始伺服器將未壓縮的物件傳回 CloudFront (HTTP回應中沒有Content-Encoding標頭), CloudFront 則判斷物件是否可以壓縮。如需如何 CloudFront判斷物件是否可以壓縮的詳細資訊,請參閱下一節。

  5. 如果物件可壓縮, 會 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 壓縮已在邊緣位置快取的物件,您需要將這些物件作廢。如需詳細資訊,請參閱使檔案無效以移除內容

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

如果您設定 CloudFront 來壓縮物件,且原始伺服器也壓縮物件,原始伺服器應包含一個標頭,該Content-Encoding標頭表示 CloudFront 物件已壓縮。當原始伺服器回應包含Content-Encoding標頭時, CloudFront 不會壓縮物件,無論標頭的值為何。 CloudFront 會將回應傳送給檢視器,並在邊緣位置快取物件。

CloudFront 壓縮的檔案類型

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

CloudFront 壓縮的物件大小

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

Content-Length 標頭

原始伺服器必須在回應中包含Content-Length標頭, CloudFront 用於判斷物件的大小是否在 CloudFront 壓縮的範圍內。如果Content-Length缺少標頭、 包含無效的值,或 包含 CloudFront 超出壓縮大小範圍的值, CloudFront 則 不會壓縮物件。

HTTP 回應的狀態碼

CloudFront 只有當回應HTTP的狀態碼為 200、 或 時403,才會壓縮物件404

回應沒有內文

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

ETag 標頭

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

CloudFront 略過壓縮

CloudFront 會盡最大努力壓縮物件。在極少數情況下, CloudFront skips compression. CloudFront make 會根據各種因素做出此決策,包括主機容量。如果 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 標頭轉換

當原始伺服器中未壓縮的物件包含有效、強ETagHTTP標頭,並 CloudFront 壓縮物件時, CloudFront 也會將強ETag標頭值轉換為弱的 ETag,並將弱ETag值傳回給檢視器。檢視器可以儲存弱ETag值,並使用它傳送具有If-None-MatchHTTP標頭的條件式請求。這可讓檢視者 CloudFront和原始伺服器將物件的壓縮和未壓縮版本視為等同詞,以減少不必要的資料傳輸。

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

當原始伺服器中的物件包含弱ETag標頭值 (以字元 開頭的值W/) CloudFront 時, 不會修改此值,並將其傳回給檢視器,使其視為從原始伺服器接收。

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

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