

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

# 提供壓縮檔案
<a name="ServingCompressedFiles"></a>

請求的物件壓縮後物件較小，下載更快 – 在某些情況下，壓縮後還不到原始檔案的四分之一大小。加速下載可讓瀏覽者享有更快速的網頁轉譯，特別是 JavaScript 和 CSS 檔案。此外，CloudFront 資料傳輸成本是根據提供的總資料量計算。提供壓縮物件的成本可能低於未壓縮物件。

**Topics**
+ [

## 設定 CloudFront 來壓縮物件
](#compressed-content-cloudfront-configuring)
+ [

## CloudFront 壓縮如何運作
](#compressed-content-cloudfront-how-it-works)
+ [

## 壓縮條件
](#compressed-content-cloudfront-notes)
+ [

## CloudFront 壓縮的檔案類型
](#compressed-content-cloudfront-file-types)
+ [

## `ETag` 標頭轉換
](#compressed-content-cloudfront-etag-header)

## 設定 CloudFront 來壓縮物件
<a name="compressed-content-cloudfront-configuring"></a>

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

**設定 CloudFront 壓縮物件 (主控台)**

1. 登入 [CloudFront 主控台](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 選擇您的分佈，然後選擇要編輯的**行為**。

1. 請將**自動壓縮物件**設定為**是**。

1. 使用[快取政策](controlling-the-cache-key.md)來指定快取設定，並確保 **Gzip** 和 **Brotli** 壓縮格式皆已啟用。

**備註**  
您必須使用[快取政策](controlling-the-cache-key.md)來使用 Brotli 壓縮。Brotli 不支援舊版快取設定。
若要使用 [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html) 或 [CloudFront](https://docs.aws.amazon.com/cloudfront/latest/APIReference/Welcome.html) API 啟用壓縮，請將 `Compress`、`EnableAcceptEncodingGzip`、`EnableAcceptEncodingBrotli` 參數設定為 `true`。

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

## CloudFront 壓縮如何運作
<a name="compressed-content-cloudfront-how-it-works"></a>

1. 一個檢視器請求了一個物件。檢視器會在請求中包含 `Accept-Encoding` HTTP 標頭，而標頭值則包含 `gzip`、`br` 或兩者。這表示檢視器支援壓縮物件。檢視器同時支援 Gzip 和 Brotli 時，CloudFront 會使用 Brotli。
**注意**  
只有在使用 HTTPS 發送請求時，Chrome 和 Firefox 網頁瀏覽器才支援 Brotli 壓縮。這兩種瀏覽器不支援 HTTP 請求的 Brotli。

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

1. CloudFront 會根據壓縮物件是否在快取中執行下列其中一項操作：
   + 如果快取中已有壓縮物件，則 CloudFront 會將物件傳送至檢視器，略過其餘步驟。
   + 如果快取中沒有壓縮物件，則 CloudFront 會將請求轉送至原始伺服器。
**注意**  
如果物件的未壓縮副本已存在於快取中，CloudFront 會將該物件傳送至檢視器，而不會將請求轉送至原始伺服器。舉例來說，如果 CloudFront [先前略過壓縮作業](#compression-skipped)，就會發生這種情況。發生這種情況時，CloudFront 會快取未壓縮的物件並繼續提供物件，直到物件過期、移出或無效為止。

1. 如果原始伺服器傳回壓縮物件 (由 HTTP 回應中出現的 `Content-Encoding` 標頭所指示)，CloudFront 會將壓縮的物件傳送到檢視器，將其新增到快取並略過其餘步驟。CloudFront 不會再次壓縮物件。

1. 如果原始伺服器將未壓縮的物件傳回到 CloudFront，且 HTTP 回應中沒有 `Content-Encoding` 標頭，CloudFront 會判斷物件是否可壓縮。如需詳細資訊，請參閱[壓縮條件](#compressed-content-cloudfront-notes)。

1. 如果物件可以壓縮，CloudFront 會壓縮物件並將其傳送至檢視器，然後新增到快取。

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

某些自訂原始伺服器也可以壓縮物件。您的原始伺服器可能可以壓縮 CloudFront 無法壓縮的物件。如需詳細資訊，請參閱[CloudFront 壓縮的檔案類型](#compressed-content-cloudfront-file-types)。

## 壓縮條件
<a name="compressed-content-cloudfront-notes"></a>

下列清單提供詳細資訊，說明 CloudFront 不會壓縮物件的情境。

**請求使用 HTTP 1.0**  
如果對 CloudFront 的請求使用 HTTP 1.0，則 CloudFront 會移除 `Accept-Encoding` 標頭，並且不會壓縮回應中的物件。

**`Accept-Encoding` 請求標頭**  
如果檢視器請求中缺少 `Accept-Encoding` 標頭，或者如果其中不包含 `gzip` 或 `br` 作為值，則 CloudFront 不會壓縮回應中的物件。如果 `Accept-Encoding` 標頭包含額外的值，例如 `deflate`，則 CloudFront 在將請求轉送到原始伺服器之前會先移除這些值。  
當 CloudFront [設定為壓縮物件](#compressed-content-cloudfront-configuring)時，它會在快取金鑰中和原始伺服器請求中自動包含 `Accept-Encoding` 標頭。

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

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

**CloudFront 壓縮的檔案類型**  
如需完整清單，請參閱 [CloudFront 壓縮的檔案類型](#compressed-content-cloudfront-file-types)。

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

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

**回應的 HTTP 狀態碼**  
只有在回應的 HTTP 狀態碼為 `200`、`403` 或 `404` 時，CloudFront 才會壓縮物件。

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

**`ETag` 標頭**  
CloudFront 有時會在壓縮物件時修改 HTTP 回應中的 `ETag` 標頭。如需詳細資訊，請參閱[`ETag` 標頭轉換](#compressed-content-cloudfront-etag-header)。

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

## CloudFront 壓縮的檔案類型
<a name="compressed-content-cloudfront-file-types"></a>

如果您設定 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` 標頭轉換
<a name="compressed-content-cloudfront-etag-header"></a>

如果來自原始伺服器的未壓縮物件包含有效的強 `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 文件中的下列頁面：
+ [指示詞](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#Directives) (`ETag` HTTP 標頭)
+ [弱驗證](https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests#Weak_validation) (HTTP 條件式請求)
+ [If-None-Match HTTP 標頭](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match)