本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
提供壓縮檔
您可 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 要設定為壓縮物件,請執行下列所有動作,更新您要提供壓縮物件的快取行為:
-
確定 Compress Objects Automatically (自動壓縮物件) 設定為 Yes (是)。(在 AWS CloudFormation 或 CloudFront API 中,設定
Compress
為true
。) -
使用快取政策來指定快取設定,並確保 Gzip 和 Brotli 設定皆已啟用。(在 AWS CloudFormation 或 CloudFront API 中,設定
EnableAcceptEncodingGzip
和EnableAcceptEncodingBrotli
為true
。) -
請確定快取政策中的 TTL 值已設為大於零的值。當您將 TTL 值設定為零時,會停用快取,而且 CloudFront 不會壓縮物件。
若要更新快取行為,您可以使用下列任何工具:
CloudFront 壓縮的工作原理
當您設定 CloudFront 為壓縮物件 (請參閱上一節) 時,它的運作方式如下:
-
一個檢視器請求了一個物件。檢視器會在請求中包含
Accept-Encoding
HTTP 標頭,而標頭值則包含gzip
、br
或兩者。這表示檢視器支援壓縮物件。當查看器同時支持 Gzip 和布羅特利時,更喜歡布羅特利 CloudFront 。注意
只有在使用 HTTPS 發送請求時,Chrome 和 Firefox 網頁瀏覽器才支援 Brotli 壓縮。這些瀏覽器不支援使用 HTTP 請求的 Brotli。
-
在邊緣位置, CloudFront 檢查緩存中是否有請求對象的壓縮副本。
-
如果壓縮的物件已經在快取中,請 CloudFront 將它傳送給檢視器,並略過剩下的步驟。
如果壓縮的物件不在快取中,請將要求 CloudFront 轉寄至來源。
注意
如果物件的未壓縮副本已經在快取中, CloudFront 可能會將它傳送給檢視器,而不需要將要求轉送至原始位置。例如, CloudFront 先前略過壓縮時可能會發生這種情況。發生這種情況時,會 CloudFront 快取未壓縮的物件並繼續提供服務,直到物件過期、收回或無效為止。
-
如果來源傳回壓縮物件 (如 HTTP 回應中存在
Content-Encoding
標頭所指出),則會將壓縮的物件 CloudFront 傳送給檢視器、將它新增至快取,然後略過剩餘步驟。 CloudFront 不會再壓縮物件。如果 origin 將未壓縮的對象返回到 CloudFront (HTTP 響應中沒有
Content-Encoding
標題),則 CloudFront 確定該對象是否可壓縮。如需有關如何 CloudFront判斷物件是否可壓縮的詳細資訊,請參閱下一節。 -
如果該對象是可壓縮的,那么請將其 CloudFront 壓縮,將其發送到查看器,然后將其添加到緩存中。(在極少數情況下, CloudFront 可能會跳過壓縮並將未壓縮的對象發送給查看器。)
CloudFront 壓縮物件時
下列清單提供有關何時 CloudFront 壓縮物件的詳細資訊。
- 請求使用 HTTP 1.0
-
如果請求 CloudFront 使用 HTTP 1.0,則 CloudFront 刪除標
Accept-Encoding
頭並且不壓縮響應中的對象。 Accept-Encoding
請求標頭-
如果查看器請求中缺少
Accept-Encoding
標頭,或者它不包含gzip
或br
作為值,則 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 狀態碼為、或
404
時200
,403
才會壓縮物件。 - 回應沒有內文
-
當來源的 HTTP 響應沒有主體時,沒有任何壓縮 CloudFront 的內容。
ETag
標頭-
CloudFront 有時會在
ETag
HTTP 回應壓縮物件時修改標頭。如需詳細資訊,請參閱 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 文件中的下列頁面: