提供壓縮檔案 - Amazon CloudFront

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

提供壓縮檔案

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

CloudFront 可以使用 Gzip 和 Brotli 壓縮格式壓縮物件。當查看器支持兩種格式,並且兩者都存在於到達的緩存服務器中時,則 CloudFront 更喜歡 Brotli。如果快取伺服器中只有一種壓縮格式,則 CloudFront 傳回它。

注意

只有在使用 HTTPS 發送請求時,Chrome 和 Firefox 網頁瀏覽器才支援 Brotli 壓縮。這些瀏覽器不支援使用 HTTP 請求的 Brotli。

請求的物件壓縮後物件較小,下載更快 – 在某些情況下,壓縮後還不到原始檔案的四分之一大小。特別是對於JavaScript 和 CSS 文件,更快的下載可以導致更快的網頁呈現為您的用戶。此外,由於 CloudFront 資料傳輸的成本是根據所提供的資料總量計算,因此提供壓縮物件的成本可能會比未壓縮的物件提供服務便宜。

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

配置 CloudFront 壓縮物件

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

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

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

  3. 請確定快取政策中的 TTL 值已設為大於零的值。當您將 TTL 值設定為零時,會停用快取,而且 CloudFront 不會壓縮物件。

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

CloudFront 壓縮的工作原理

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

  1. 一個檢視器請求了一個物件。檢視器會在請求中包含 Accept-Encoding HTTP 標頭,而標頭值則包含 gzipbr 或兩者。這表示檢視器支援壓縮物件。當查看器同時支持 Gzip 和布羅特利時,更喜歡布羅特利 CloudFront 。

    注意

    只有在使用 HTTPS 發送請求時,Chrome 和 Firefox 網頁瀏覽器才支援 Brotli 壓縮。這些瀏覽器不支援使用 HTTP 請求的 Brotli。

  2. 在邊緣位置, CloudFront 檢查緩存中是否有請求對象的壓縮副本。

  3. 如果壓縮的物件已經在快取中,請 CloudFront 將它傳送給檢視器,並略過剩下的步驟。

    如果壓縮的物件不在快取中,請將要求 CloudFront 轉寄至來源。

    注意

    如果物件的未壓縮副本已經在快取中, CloudFront 可能會將它傳送給檢視器,而不需要將要求轉送至原始位置。例如, CloudFront 先前略過壓縮時可能會發生這種情況。發生這種情況時,會 CloudFront 快取未壓縮的物件並繼續提供服務,直到物件過期、收回或無效為止。

  4. 如果來源傳回壓縮物件 (如 HTTP 回應中存在Content-Encoding標頭所指出),則會將壓縮的物件 CloudFront 傳送給檢視器、將它新增至快取,然後略過剩餘步驟。 CloudFront 不會再壓縮物件。

    如果 origin 將未壓縮的對象返回到 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 轉送至您的來源時,當您的 origin 傳回 HTTP 狀態碼 304 時,CloudFront 不會壓縮物件,也就是說邊緣位置已經擁有該物件的最新版本。如果您 CloudFront 要壓縮已快取在邊緣位置的物件,則需要使這些物件無效。如需詳細資訊,請參閱 使檔案失效

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

如果您設定 CloudFront 為壓縮物件,而原點也會壓縮物件,則原點應包含Content-Encoding標頭,表示物件已經壓縮。 CloudFront 當來自來源的響應包含標Content-Encoding題時, CloudFront 不會壓縮對象,而不管標題的值如何。 CloudFront 將回應傳送給檢視器,並將物件快取至節點位置。

CloudFront 壓縮的檔案類型

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

CloudFront 壓縮物件的大小

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

Content-Length 標頭

原點必須在響應中包含一個Content-Length標頭,該標題 CloudFront用於確定對象的大小是否在 CloudFront壓縮的範圍內。如果標Content-Length頭遺失、包含無效值,或包含超出壓縮大小範圍的值,則 CloudFront 不會壓縮物件。 CloudFront

回應的 HTTP 狀態碼

CloudFront 只有當回應的 HTTP 狀態碼為、或404200403才會壓縮物件。

回應沒有內文

當來源的 HTTP 響應沒有主體時,沒有任何壓縮 CloudFront 的內容。

ETag 標頭

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

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頭值轉換為 weakETag,並將弱ETag值傳回給檢視器。檢視器可以儲存弱值 ETag,並使用它來傳送具有 If-None-Match HTTP 標頭的條件式請求。這可讓檢視者和來源將物件的壓縮和未壓縮版本視為語意等效,進而減少不必要的資料傳輸。 CloudFront

有效的強式 ETag 標頭值以雙引號字元 (") 開頭。要將強ETag值轉換為弱值,請將字符 CloudFront 添加W/到強ETag值的開頭。

當來自 origin 的物件包含弱ETag標頭值 (以字元開頭的值W/) 時, CloudFront 不會修改此值,並將它傳回給檢視器,如同從原點接收的那樣。

當來自 origin 的物件包含無效的ETag標頭值 (該值開頭不是"或以W/) 時,會 CloudFront 移除ETag標頭並將物件傳回給檢視器,而不含回ETag應標頭。

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