

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

# 使用政策控制快取金鑰
<a name="controlling-the-cache-key"></a>

透過 *CloudFront* 快取政策，您可以指定要由 CloudFront 納入*快取金鑰*中的 HTTP 標頭、Cookie，以及查詢字串，作為 CloudFront 邊緣節點快取物件的依據。快取金鑰是快取中每個物件的唯一識別碼，它會決定檢視器請求是否會導致*快取命中*。

當檢視者請求產生與先前請求相同的快取金鑰，且該快取金鑰的物件位於節點的快取中且有效時，就會發生快取命中。當有快取點擊時，物件會從 CloudFront 邊緣節點提供給檢視者，這具有下列優點：
+ 降低原始伺服器的負載
+ 減少檢視器的延遲

在快取金鑰中包含較少的值會增加快取命中的可能性。因為這會擁有較高的*快取命中率* (較高的瀏覽者請求會導致快取命中)，您便可以從網站或應用程式獲得較佳的效能。如需詳細資訊，請參閱[了解快取金鑰](understanding-the-cache-key.md)。

若要控制快取金鑰，您可以使用 CloudFront *快取政策*。您可以將快取政策附加到 CloudFront 分佈中的一或多個快取行為。

您也可以使用快取政策來指定 CloudFront 快取中物件的存留時間 (TTL) 設定，並啟用 CloudFront 以請求和快取壓縮物件。

**注意**  
快取設定不影響 gRPC，因為 gRPC 流量無法進行快取。如需詳細資訊，請參閱[使用 gRPC 搭配 CloudFront 分佈](distribution-using-grpc.md)。

**Topics**
+ [了解快取政策](cache-key-understand-cache-policy.md)
+ [建立快取政策](cache-key-create-cache-policy.md)
+ [使用受管快取政策](using-managed-cache-policies.md)
+ [了解快取金鑰](understanding-the-cache-key.md)

# 了解快取政策
<a name="cache-key-understand-cache-policy"></a>

您可以使用快取政策藉由控制快取金鑰中包含的值 (URL 查詢字串、HTTP 標頭和 Cookie) 來改善快取命中率。CloudFront 會針對常見使用案例提供一些預先定義的快取政策 (稱為*受管政策*)。您可以使用這些受管政策，也可以建立專屬於您需求的專屬快取政策。如需有關受管政策的詳細資訊，請參閱 [使用受管快取政策](using-managed-cache-policies.md)。

快取政策包含下列設定，這些設定分類為*政策資訊*、*存留時間 (TTL) 設定*，以及*快取金鑰設定*。

## 政策資訊
<a name="cache-key-understand-cache-policy-info"></a>

**名稱**  
用來識別快取政策的唯一名稱。在主控台中，您可以使用名稱將快取政策附加到快取行為。

**描述**  
用來描述快取政策的備註。這是選用的，但它可以協助您識別快取政策的目的。

## 存活期 (TTL) 設定
<a name="cache-key-understand-cache-policy-ttl"></a>

存留時間 (TTL) 設定會與 `Cache-Control` 和 `Expires` HTTP 標頭 (如果它們在原始回應中) 一起運作，以判斷 CloudFront 快取中物件保持有效的時間長度。

**最短 TTL**  
預設時間的長度下限 (以秒為單位)，此時間是您希望在 CloudFront 檢查來源以查看物件是否已更新前，物件要停留在 CloudFront 快取中的時間。如需詳細資訊，請參閱[管理內容保持在快取中達多久時間 (過期)](Expiration.md)。  
如果您的最小 TTL 大於 0，則即使原始伺服器標頭中存在 `Cache-Control: no-cache`、`no-store` 或 `private` 指令，CloudFront 也會快取內容至少達到快取政策最短 TTL 中指定的持續時間。

**最長 TTL**  
時間的長度上限 (以秒為單位)，此時間是 CloudFront 檢查來源以查看物件是否已更新前，物件要停留在 CloudFront 快取中的時間。只有在來源與物件一起傳送 `Cache-Control` 或 `Expires` 標頭時，CloudFront 才會使用此設定。如需詳細資訊，請參閱 [管理內容保持在快取中達多久時間 (過期)](Expiration.md)。

**預設 TTL**  
預設時間長度 (以秒為單位)，此時間是您希望在 CloudFront 檢查來源以查看物件是否已更新前，物件要停留在 CloudFront 快取中的時間。只有在原始伺服器物件*未*與物件一起傳送 `Cache-Control` 或 `Expires` 標頭時，CloudFront 才會使用此設定的值做為物件的 TTL。如需詳細資訊，請參閱[管理內容保持在快取中達多久時間 (過期)](Expiration.md)。

**注意**  
如果**最短 TTL**、**最長 TTL** 和**預設 TTL** 設定都設為 0，這會停用 CloudFront 快取。

## 快取金鑰設定
<a name="cache-key-understand-cache-policy-settings"></a>

快取金鑰設定會指定檢視器請求中 CloudFront 包含在快取金鑰中的值。這些值可以包括 URL 查詢字串、HTTP 標頭和 Cookie。您包含在快取金鑰中的值會自動包含在 CloudFront 傳送至原始伺服器的請求中，稱為*原始伺服器請求*。如需在不影響快取金鑰的情況下控制原始伺服器請求的相關資訊，請參閱 [使用政策控制原始伺服器請求](controlling-origin-requests.md)。

快取金鑰設定包括：
+ [標頭](#cache-policy-headers)
+ [Cookie](#cache-policy-cookies)
+ [查詢字串](#cache-policy-query-strings)
+ [壓縮支援](#cache-policy-compressed-objects)

**標頭**  
在檢視器請求中，CloudFront 會包含在快取金鑰和原始伺服器請求中的 HTTP 標頭。針對標頭，您可以選擇下列設定之一：  
+ **無** - 檢視器請求中的 HTTP 標頭*不會*包含在快取金鑰中，也*不會*自動包含在原始伺服器請求中。
+ **Include the following headers** (包含以下標頭) - 您可以指定檢視器請求中的哪些 HTTP 標頭會包含在快取金鑰中，並自動包含在原始伺服器請求中。
當您使用 **Include the following headers** (包含以下標頭) 設定時，您可以指定 HTTP 標頭的名稱，而不是它們的值。例如，請參閱下列 HTTP 標頭：  

```
Accept-Language: en-US,en;q=0.5
```
在這種情況下，您可以將標頭指定為 `Accept-Language`，而不是 `Accept-Language: en-US,en;q=0.5`。但是，在快取金鑰和原始伺服器請求中，CloudFront 會包含完整的標頭，包括其值。  
您也可以在快取金鑰中，包含由 CloudFront 產生的某些標頭。如需詳細資訊，請參閱[新增 CloudFront 請求標頭](adding-cloudfront-headers.md)。

**Cookie**  
在檢視器請求中，CloudFront 會包含在快取金鑰和原始伺服器請求中的 Cookie。針對 Cookie，您可以選擇下列設定之一：。  
+ **無** - 檢視器請求中的 Cookie *不會*包含在快取金鑰中，也*不會*自動包含在原始伺服器請求中。
+ **所有** - 檢視器請求中的所有 Cookie 都包含在快取金鑰中，並自動包含在原始伺服器請求中。
+ **Include specified cookies** (包含指定的 Cookie) - 您可以指定檢視器請求中的哪些 Cookie 會包含在快取金鑰中，並自動包含在原始伺服器請求中。
+ **Include all cookies except** (包含所有 Cookie，除了：) - 您可以指定檢視器請求中的哪些 Cookie *不會*包含在快取金鑰中，且*不會*自動包含在原始伺服器請求中。所有其他 Cookie、您預期指定的 Cookie，*都會*包含在快取金鑰中，並自動包含在原始伺服器請求中。
當您使用 **Include specified cookies** (包含指定 Cookie) 或 **Include all cookies except** (包含所有 Cookie，除了：) 設定時，您可以依名稱指定 Cookie，而不是依值來指定 Cookie。例如，請參閱下列 `Cookie` 標頭：  

```
Cookie: session_ID=abcd1234
```
在這種情況下，您可以將 Cookie 指定為 `session_ID`，而不是 `session_ID=abcd1234`。但是，CloudFront 會在快取金鑰和原始伺服器請求中包括完整的 Cookie，包括它的值。

**查詢字串**  
在檢視器請求中，CloudFront 會包含在快取金鑰和原始伺服器請求中的 URL 查詢字串。對於查詢字串，您可以選擇下列其中一個設定：  
+ **無** – 檢視器請求中的查詢字串*不會*包含在快取金鑰中，也*不會*自動包含在原始伺服器的請求中。
+ **所有** – 檢視器請求中的所有查詢字串都會包含在快取金鑰中，並且也會自動包含在原始伺服器請求中。
+ **Include specified query strings** (包含指定的查詢字串) – 您可以指定檢視器請求中的哪些查詢字串會包含在快取金鑰中，並自動包含在原始伺服器請求中。
+ **Include all query strings except** (包含所有查詢字串，除了：) – 您可以指定檢視器請求中的哪些查詢字串*不會*包含在快取金鑰中，且*不會*自動包含在原始伺服器請求中。所有其他查詢字串 (您指定的查詢字串) *都會*包含在快取金鑰中，並自動包含在原始伺服器請求中。
當您使用 **Include specified query strings** (包含指定的查詢字串) 或 **Include all query strings except** (包含所有查詢字串，除了：) 設定時，您可以依名稱來指定查詢字串，而不是依值來指定查詢字串。例如，請參閱下列 URL 路徑。  

```
/content/stories/example-story.html?split-pages=false
```
在這種情況下，您可以將查詢字串指定為 `split-pages`，而不是 `split-pages=false`。不過，在快取金鑰和原始伺服器請求中，CloudFront 會包含完整的查詢字串 (包括其值)。  
對於快取金鑰設定，CloudFront 會將標頭、查詢字串和 Cookie 的星號字元 (`*`) 視為文字字串，而不是萬用字元。

**壓縮支援**  
當檢視器支援 CloudFront 時，這些設定可以請求和快取以 Gzip 或 Brotli 壓縮格式壓縮的物件。這些設定也允許 [CloudFront 壓縮](ServingCompressedFiles.md)運作。檢視器透過 `Accept-Encoding` HTTP 標頭表示他們支援這些壓縮格式。  
只有在使用 HTTPS 發送請求時，Chrome 和 Firefox 網頁瀏覽器才支援 Brotli 壓縮。這些瀏覽器不支援使用 HTTP 請求的 Brotli。
當下列任一條件成立時，請啟用這些設定：  
+ 當查看者支援它們時，您的原始伺服器返回 Gzip 壓縮物件 (請求包含帶有值 `gzip` 的 `Accept-Encoding` HTTP 標頭)。在此情況下，請使用**啟用 Gzip** 的設定 （在 CloudFront API、 AWS SDKs或 `true`中`EnableAcceptEncodingGzip`設定為 CloudFormation)。 AWS CLI
+ 當查看者支援它們時，您的原始伺服器返回 Brotli 壓縮物件 (請求包含帶有值 `br` 的 `Accept-Encoding` HTTP 標頭)。在此情況下，請使用**已啟用 Brotli** 的設定 （在 CloudFront API、 AWS SDKs或 `true`中`EnableAcceptEncodingBrotli`設定為 CloudFormation)。 AWS CLI
+ 此快取政策連接到的快取行為會設定 [CloudFront 壓縮](ServingCompressedFiles.md)。在這種情況下，您可以啟用 Gzip 或 Brotli 的快取，或兩者的快取。啟用 CloudFront 壓縮時，啟用兩種格式的快取可協助降低資料傳輸到網際網路的成本。
如果您針對其中一種或兩種壓縮格式啟用快取，請勿在與相同快取行為相關聯的[原始伺服器請求政策](controlling-origin-requests.md)中包含 `Accept-Encoding` 標頭。當針對這些格式啟用快取時，CloudFront 一律會在原始伺服器請求中包含此標頭，因此在原始伺服器請求政策中包含 `Accept-Encoding` 沒有任何作用。
如果您的原始伺服器未傳回 Gzip 或 Brotli 壓縮物件，或是快取行為未設定 CloudFront 壓縮，請勿啟用壓縮物件的快取功能。如果您這樣做，可能會導致[快取命中率](cache-hit-ratio.md)降低。  
以下說明這些設定如何影響 CloudFront 分佈。下列所有案例假設檢視器請求會包含 `Accept-Encoding` 標頭。當檢視者請求不包含 `Accept-Encoding` 標頭時，CloudFront 不會在快取金鑰中包含此標頭，也不會將其包含在對應的原始伺服器請求中。    
**針對兩種壓縮格式啟用快取壓縮物件時**  
如果檢視器同時支援 Gzip 和 Brotli，亦即如果 `gzip` 和 `br` 值都在檢視器請求的 `Accept-Encoding` 標頭中，則 CloudFront 執行以下操作：  
+ 將標頭標準化為 `Accept-Encoding: br,gzip`，並在快取金鑰中包含標準化標頭。快取金鑰不包含檢視者傳送的 `Accept-Encoding` 標頭中的其他值。
+ 如果節點位置在快取中有符合請求且未過期的 Brotli 或 Gzip 壓縮物件，則節點位置會將物件傳回給檢視器。
+ 如果邊緣節點在快取中沒有符合請求且未過期的 Brotli 或 Gzip 壓縮物件，則 CloudFront 會在對應的原始伺服器請求中包含標準化標頭 (`Accept-Encoding: br,gzip`)。原始伺服器請求不包含檢視者傳送的 `Accept-Encoding` 標頭中的其他值。
如果檢視器支援一種壓縮格式，但不支援另一種壓縮格式—例如，如果 `gzip` 是檢視器請求中 `Accept-Encoding` 標頭中的值，但 `br` 不是—CloudFront 會有以下操作：  
+ 將標頭標準化為 `Accept-Encoding: gzip`，並在快取金鑰中包含標準化標頭。快取金鑰不包含檢視者傳送的 `Accept-Encoding` 標頭中的其他值。
+ 如果節點位置在快取中有符合請求且未過期的 Gzip 壓縮物件，則節點位置會將物件傳回給檢視器。
+ 如果邊緣節點在快取中沒有符合請求且未過期的 Gzip 壓縮物件，則 CloudFront 會在對應的原始伺服器請求中包含標準化標頭 (`Accept-Encoding: gzip`)。原始伺服器請求不包含檢視者傳送的 `Accept-Encoding` 標頭中的其他值。
若要瞭解如果檢視器支援 Brotli 但不支援 Gzip 時，CloudFront 會如何因應，請將前面例子中的兩種壓縮格式相互替換。  
如果檢視器不支援 Brotli 或 Gzip—亦即檢視器請求中的 `Accept-Encoding` 標頭不包含 `br` 或 `gzip` 作為值—則 CloudFront：  
+ 不包含在快取金鑰中的 `Accept-Encoding` 標頭。
+ 包含 `Accept-Encoding: identity` 在相應的原始伺服器請求中。原始伺服器請求不包含檢視者傳送的 `Accept-Encoding` 標頭中的其他值。  
**針對某種壓縮格式啟用快取壓縮物件時，但不啟用另一種壓縮格式**  
如果檢視器支持啟用快取的格式—例如，如果為 Gzip 啟用了快取壓縮物件，並且檢視器支援 Gzip (`gzip` 是檢視器請求中 `Accept-Encoding` 標頭的值之一)—CloudFront 會執行以下操作：  
+ 將標頭標準化為 `Accept-Encoding: gzip`，並在快取金鑰中包含標準化標頭。
+ 如果節點位置在快取中有符合請求且未過期的 Gzip 壓縮物件，則節點位置會將物件傳回給檢視器。
+ 如果邊緣節點在快取中沒有符合請求且未過期的 Gzip 壓縮物件，則 CloudFront 會在對應的原始伺服器請求中包含標準化標頭 (`Accept-Encoding: gzip`)。原始伺服器請求不包含檢視者傳送的 `Accept-Encoding` 標頭中的其他值。
當檢視器同時支援 Gzip 和 Brotli (檢視器請求中的 `Accept-Encoding` 標頭同時包含 `gzip` *和* `br` 值) 時，這種行為是相同的，因為在這種情況下，不會啟用快取 Brotli 的壓縮物件。  
若要瞭解 CloudFront 如果已針對 Brotli 啟用快取壓縮物件，但未啟用 Gzip，請在前面的範例中將兩種壓縮格式取代。  
如果檢視器不支援啟用快取的壓縮格式 (檢視器請求中的 `Accept-Encoding` 標頭不包含該格式的值)，則 CloudFront：  
+ 不包含在快取金鑰中的 `Accept-Encoding` 標頭。
+ 包含 `Accept-Encoding: identity` 在相應的原始伺服器請求中。原始伺服器請求不包含檢視者傳送的 `Accept-Encoding` 標頭中的其他值。  
**針對兩種壓縮格式停用快取壓縮物件時**  
針對這兩種壓縮格式停用快取壓縮物件時，CloudFront 會將 `Accept-Encoding` 標頭視為檢視器請求中任何其他 HTTP 標頭相同。預設情況下，系統不會將其不會包含在快取金鑰中，也不包含在原始伺服器請求中。您可以將其包含在快取政策中的標頭清單或原始伺服器請求政策中，如同任何其他 HTTP 標頭。

# 建立快取政策
<a name="cache-key-create-cache-policy"></a>

您可以使用快取政策藉由控制快取金鑰中包含的值 (URL 查詢字串、HTTP 標頭和 Cookie) 來改善快取命中率。您可以在 CloudFront 主控台中使用 AWS Command Line Interface (AWS CLI) 或 CloudFront API 建立快取政策。

建立快取政策之後，您可以將它連接到 CloudFront 分佈中的一或多個快取行為。

------
#### [ Console ]

**建立快取政策 (主控台)**

1. 登入 AWS 管理主控台 ，並在位於 的 CloudFront 主控台中開啟**政策**頁面[https://console.aws.amazon.com/cloudfront/v4/home?#/policies](https://console.aws.amazon.com/cloudfront/v4/home?#/policies)。

1. 選擇**建立快取政策**。

1. 選擇此快取政策所需的設定。如需詳細資訊，請參閱 [了解快取政策](cache-key-understand-cache-policy.md)。

1. 完成時，請選擇 **Create** (建立)。

建立快取政策之後，您可以將其附加到快取行為。

**若要將快取政策附加至現有分佈 (主控台)**

1. 在位於 [https://console.aws.amazon.com/cloudfront/v4/home#/distributions](https://console.aws.amazon.com/cloudfront/v4/home#/distributions) 的 CloudFront 主控台中開啟 **Distributions** (分佈) 頁面。

1. 選擇要更新的分佈，然後選擇**行為**索引標籤。

1. 選擇要更新的快取行為，然後選擇**編輯**。

   或者，若要建立新的快取行為，請選擇 **Create behavior** (建立行為)。

1. 在 **Cache key and origin requests** (快取金鑰和原始伺服器請求) 一節中，請確定已選擇 **Cache policy and origin request policy** (快取政策和原始伺服器請求政策)。

1. 在 **Cache policy** (快取政策) 中，選擇要連接到此快取行為的快取政策。

1. 請在頁面底部選擇 **Save changes** (儲存變更)。

**若要將快取政策附加至新分佈 (主控台)**

1. 在 [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home) 中開啟 CloudFront 主控台。

1. 選擇 **Create Distribution** (建立分佈)。

1. 在 **Cache key and origin requests** (快取金鑰和原始伺服器請求) 一節中，請確定已選擇 **Cache policy and origin request policy** (快取政策和原始伺服器請求政策)。

1. 在 **Cache policy** (快取政策) 中，選擇要連接到此分佈預設快取行為的快取政策。

1. 為原始伺服器、預設快取行為和其他分佈設定選擇所需的設定。如需詳細資訊，請參閱 [所有分佈設定參考](distribution-web-values-specify.md)。

1. 完成後，請選擇 **Create distribution** (建立分佈)。

------
#### [ CLI ]

若要使用 AWS Command Line Interface (AWS CLI) 建立快取政策，請使用 **aws cloudfront create-cache-policy**命令。您可以使用輸入檔案來提供命令的輸入參數，而不是將每個個別參數指定為命令列輸入。

**建立快取政策 (包含輸入檔案的 CLI)**

1. 使用下列命令建立一個名為 `cache-policy.yaml` 的檔案，其中包含 **create-cache-policy** 命令的所有輸入參數。

   ```
   aws cloudfront create-cache-policy --generate-cli-skeleton yaml-input > cache-policy.yaml
   ```

1. 開啟您剛才建立且命名為 `cache-policy.yaml` 的檔案。編輯檔案以指定您想要的快取政策設定，然後儲存檔案。您可以從檔案中移除選用欄位，但不要移除必要欄位。

   如需有關快取政策設定的詳細資訊，請參閱 [了解快取政策](cache-key-understand-cache-policy.md)。

1. 使用下列命令，使用 `cache-policy.yaml` 檔案中的輸入參數建立快取政策。

   ```
   aws cloudfront create-cache-policy --cli-input-yaml file://cache-policy.yaml
   ```

   記下命令輸出中的 `Id` 值。這是快取政策 ID，而且您需要它將快取政策連接到 CloudFront 分佈的快取行為。

**將快取政策附加至現有分佈 (包含輸入檔案的 CLI)**

1. 使用下列命令來儲存您想要更新之 CloudFront 分發的分發組態。將 *distribution\$1ID* 取代為分佈的 ID。

   ```
   aws cloudfront get-distribution-config --id distribution_ID --output yaml > dist-config.yaml
   ```

1. 開啟您剛才建立且命名為 `dist-config.yaml` 的檔案。編輯檔案，對您要更新為使用快取政策的每個快取行為進行下列變更。
   + 在快取行為中，新增名為 `CachePolicyId` 的欄位。對於欄位值，請使用您在建立政策後記下的快取政策 ID。
   + 從快取行為中移除 `MinTTL`、`MaxTTL`、`DefaultTTL` 和 `ForwardedValues` 欄位。這些設定是在快取政策中指定的，因此您無法在相同的快取行為中包含這些欄位和快取政策。
   + 將 `ETag` 欄位重新命名為 `IfMatch`，但不要變更欄位的值。

   完成後儲存檔案。

1. 使用下列命令來更新分佈以使用快取政策。將 *distribution\$1ID* 取代為分佈的 ID。

   ```
   aws cloudfront update-distribution --id distribution_ID --cli-input-yaml file://dist-config.yaml
   ```

**若要將快取政策附加至新分佈 (包含輸入檔案的 CLI)**

1. 使用下列命令建立一個名為 `distribution.yaml` 的檔案，其中包含 **create-distribution** 命令的所有輸入參數。

   ```
   aws cloudfront create-distribution --generate-cli-skeleton yaml-input > distribution.yaml
   ```

1. 開啟您剛才建立且命名為 `distribution.yaml` 的檔案。在預設快取行為的 `CachePolicyId` 欄位中，輸入您在建立政策後記下的快取政策 ID。繼續編輯檔案以指定所需的分佈設定，然後在完成後儲存檔案。

   如需有關分佈設定的詳細資訊，請參閱 [所有分佈設定參考](distribution-web-values-specify.md)。

1. 使用下列命令，使用 `distribution.yaml` 檔案中的輸入參數建立分佈。

   ```
   aws cloudfront create-distribution --cli-input-yaml file://distribution.yaml
   ```

------
#### [ API ]

若要使用 CloudFront API 建立快取政策，請使用 [CreateCachePolicy](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateCachePolicy.html)。如需您在此 API 呼叫中指定欄位的詳細資訊，請參閱 [了解快取政策](cache-key-understand-cache-policy.md)和 AWS SDK 或其他 API 用戶端的 API 參考文件。

建立快取政策之後，您可以使用下列其中一個 API 呼叫，將其附加至快取行為：
+ 若要將它附加到現有分佈中的快取行為，請使用 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。
+ 若要將它附加到新分佈中的快取行為，請使用 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)。

對於這兩個 API 呼叫，請在快取行為中的 `CachePolicyId` 欄位中提供快取請求政策的 ID。如需您在這些 API 呼叫中指定之其他欄位的詳細資訊，請參閱 [所有分佈設定參考](distribution-web-values-specify.md)和 AWS SDK 或其他 API 用戶端的 API 參考文件。

------

# 使用受管快取政策
<a name="using-managed-cache-policies"></a>

CloudFront 提供一組受管快取政策，您可以將這些政策附加至分佈的任何快取行為。使用受管快取政策，您不需要撰寫或維護自己的快取政策。受管政策會使用針對特定使用案例最佳化的設定。

若要使用受管快取政策，請將其附加至分佈中的快取行為。此程序與您建立快取政策時的程序相同，但您只要附加其中一個受管快取政策，而不是建立新政策。您可以透過名稱 （使用主控台） 或 ID （使用 AWS CLI 或 SDKs) 連接政策。名稱和 ID 會列在下一節中。

如需詳細資訊，請參閱[建立快取政策](cache-key-create-cache-policy.md)。

下列主題說明您可以使用的受管快取政策。

**Topics**
+ [Amplify](#managed-cache-policy-amplify)
+ [CachingDisabled](#managed-cache-policy-caching-disabled)
+ [CachingOptimized](#managed-cache-caching-optimized)
+ [CachingOptimizedForUncompressedObjects](#managed-cache-caching-optimized-uncompressed)
+ [Elemental-MediaPackage](#managed-cache-policy-mediapackage)
+ [UseOriginCacheControlHeaders](#managed-cache-policy-origin-cache-headers)
+ [UseOriginCacheControlHeaders-QueryStrings](#managed-cache-policy-origin-cache-headers-query-strings)

## Amplify
<a name="managed-cache-policy-amplify"></a>

[在 CloudFront 主控台中檢視此政策](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/2e54312d-136d-493c-8eb9-b001f22f67d2)

此政策是專為與 [AWS Amplify](https://aws.amazon.com/amplify/) Web 應用程式的原始伺服器搭配使用而設計。

使用 CloudFormation AWS CLI、 或 CloudFront API 時，此政策的 ID 為：

`2e54312d-136d-493c-8eb9-b001f22f67d2`

此政策包括下列設定：
+ **最小 TTL：**2 秒
+ **最長 TTL：**600 秒 (10 分鐘)
+ **預設 TTL：**2 秒
+ **包含在快取金鑰中的標頭：**
  + `Authorization`
  + `CloudFront-Viewer-Country`
  + `Host`

  由於已啟用快取壓縮物件設定，因此也會包含標準化的 `Accept-Encoding` 標頭。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **快取金鑰中包含的 Cookie：**所有 Cookie 都包含在內。
+ **快取金鑰中包含的查詢字串：**包含所有查詢字串。
+ **快取壓縮物件設定：**已啟用。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

**警告**  
由於此政策擁有大於 0 的最小 TTL，CloudFront 將快取內容至少達快取政策最短 TTL 中指定的持續時間，即使原始伺服器標頭中存在 `Cache-Control: no-cache`、`no-store` 或 `private` 指令。

### AWS Amplify 託管快取政策
<a name="additional-amplify-policies"></a>

Amplify 使用以下受管快取政策來最佳化客戶應用程式的預設快取組態：
+ [Amplify-Default](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/4d1d2f1d-3a71-49ad-9e08-7ea5d843a556)
+ [Amplify-DefaultNoCookies](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/a6bad946-36c3-4c33-aa98-362c74a7fb13)
+ [Amplify-ImageOptimization](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/1c6db51a-a33f-469a-8245-dae26771f530)
+ [Amplify-StaticContent](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/7e5fad67-ee98-4ad0-b05a-394999eefc1a)

**注意**  
這些政策僅供 Amplify 使用。我們不建議您將這些政策用於分佈。

如需管理 Amplify 託管應用程式快取組態的詳細資訊，請參閱《*Amplify 託管使用者指南*》中的[管理快取組態](https://docs.aws.amazon.com/amplify/latest/userguide/caching.html)。

## CachingDisabled
<a name="managed-cache-policy-caching-disabled"></a>

[在 CloudFront 主控台中檢視此政策](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/4135ea2d-6df8-44a3-9df3-4b5a84be39ad)

此政策會停用快取。此政策對於動態內容和無法快取的請求非常有用。

使用 CloudFormation AWS CLI、 或 CloudFront API 時，此政策的 ID 為：

`4135ea2d-6df8-44a3-9df3-4b5a84be39ad`

此政策包括下列設定：
+ **最小 TTL：**0 秒
+ **最長 TTL：**0 秒
+ **預設 TTL：**0 秒
+ **快取金鑰中包含的標頭：**無
+ **快取金鑰中包含的 Cookie：**無
+ **快取金鑰中包含的查詢字串：**無
+ **快取壓縮物件設定：**停用

## CachingOptimized
<a name="managed-cache-caching-optimized"></a>

[在 CloudFront 主控台中檢視此政策](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/658327ea-f89d-4fab-a63d-7e88639e58f6)

此政策的設計目的是將 CloudFront 包含在快取金鑰中的值降至最低，以最佳化快取效率。CloudFront 不會在快取金鑰中包含任何查詢字串或 Cookie，而且只會包含標準化的 `Accept-Encoding` 標頭。這可讓 CloudFront 在原點傳回物件或啟用 [CloudFront 邊緣壓縮](ServingCompressedFiles.md)時，分別以 Gzip 和 Brotli 壓縮格式快取物件。

使用 CloudFormation AWS CLI、 或 CloudFront API 時，此政策的 ID 為：

`658327ea-f89d-4fab-a63d-7e88639e58f6`

此政策包括下列設定：
+ **最小 TTL：**1 秒。
+ **最長 TTL：**31,536,000 秒 (365 天)。
+ **預設 TTL：**86,400 秒 (24 小時)。
+ **快取金鑰中包含的標頭：**沒有明確包含任何標頭。包含標準化的 `Accept-Encoding` 標頭，因為已啟用快取壓縮物件設定。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **快取金鑰中包含的 Cookie：**無。
+ **快取金鑰中包含的查詢字串：**無。
+ **快取壓縮物件設定：**已啟用。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

**警告**  
由於此政策擁有大於 0 的最小 TTL，CloudFront 將快取內容至少達快取政策最短 TTL 中指定的持續時間，即使原始伺服器標頭中存在 `Cache-Control: no-cache`、`no-store` 或 `private` 指令。

## CachingOptimizedForUncompressedObjects
<a name="managed-cache-caching-optimized-uncompressed"></a>

[在 CloudFront 主控台中檢視此政策](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/b2884449-e4de-46a7-ac36-70bc7f1ddd6d)

此政策的設計目的是將快取金鑰中包含的值降至最低，以最佳化快取效率。不包括查詢字串、標頭或 Cookie。此政策與前一個政策相同，但會停用快取壓縮物件設定。

使用 CloudFormation AWS CLI、 或 CloudFront API 時，此政策的 ID 為：

`b2884449-e4de-46a7-ac36-70bc7f1ddd6d`

此政策包括下列設定：
+ **最小 TTL：**1 秒
+ **最長 TTL：**31,536,000 秒 (365 天)
+ **預設 TTL：**86,400 秒 (24 小時)
+ **快取金鑰中包含的標頭：**無
+ **快取金鑰中包含的 Cookie：**無
+ **快取金鑰中包含的查詢字串：**無
+ **快取壓縮物件設定：**停用

**警告**  
由於此政策擁有大於 0 的最小 TTL，CloudFront 將快取內容至少達快取政策最短 TTL 中指定的持續時間，即使原始伺服器標頭中存在 `Cache-Control: no-cache`、`no-store` 或 `private` 指令。

## Elemental-MediaPackage
<a name="managed-cache-policy-mediapackage"></a>

[在 CloudFront 主控台中檢視此政策](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/08627262-05a9-4f76-9ded-b50ca2e3a84f)

此政策是專為與 AWS Elemental MediaPackage 端點的原始伺服器搭配使用而設計。

使用 CloudFormation AWS CLI、 或 CloudFront API 時，此政策的 ID 為：

`08627262-05a9-4f76-9ded-b50ca2e3a84f`

此政策包括下列設定：
+ **最小 TTL：**0 秒
+ **最長 TTL：**31,536,000 秒 (365 天)
+ **預設 TTL：**86,400 秒 (24 小時)
+ **快取金鑰中包含的標頭：**
  + `Origin`

  由於已為 Gzip 啟用快取壓縮物件設定，所以也會包含標準化的 `Accept-Encoding` 標頭。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **快取金鑰中包含的 Cookie：**無
+ **快取金鑰中包含的查詢字串：**
  + `aws.manifestfilter`
  + `start`
  + `end`
  + `m`
+ **快取壓縮物件設定：**已為 Gzip 啟用。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

## UseOriginCacheControlHeaders
<a name="managed-cache-policy-origin-cache-headers"></a>

[在 CloudFront 主控台中檢視此政策](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/83da9c7e-98b4-4e11-a168-04f0df8e2c65)

此政策旨在與傳回 `Cache-Control` HTTP 回應標頭的原始伺服器搭配使用，且不會根據查詢字串中存在的值提供不同的內容。如果您的原始伺服器根據查詢字串中的值提供不同的內容，請考慮使用 [UseOriginCacheControlHeaders-QueryStrings](#managed-cache-policy-origin-cache-headers-query-strings)。

使用 CloudFormation AWS CLI、 或 CloudFront API 時，此政策的 ID 為：

`83da9c7e-98b4-4e11-a168-04f0df8e2c65`

此政策包括下列設定：
+ **最小 TTL：**0 秒
+ **最長 TTL：**31,536,000 秒 (365 天)
+ **預設 TTL：**0 秒
+ **快取金鑰中包含的標頭：**
  + `Host`
  + `Origin`
  + `X-HTTP-Method-Override`
  + `X-HTTP-Method`
  + `X-Method-Override`

  由於已啟用快取壓縮物件設定，因此也會包含標準化的 `Accept-Encoding` 標頭。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **快取金鑰中包含的 Cookie：**所有 Cookie 都包含在內。
+ **快取金鑰中包含的查詢字串：**無。
+ **快取壓縮物件設定：**已啟用。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

## UseOriginCacheControlHeaders-QueryStrings
<a name="managed-cache-policy-origin-cache-headers-query-strings"></a>

[在 CloudFront 主控台中檢視此政策](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/4cc15a8a-d715-48a4-82b8-cc0b614638fe)

此政策旨在與傳回 `Cache-Control` HTTP 回應標頭的原始伺服器搭配使用，並根據查詢字串中存在的值提供不同的內容。如果您的原始伺服器未根據查詢字串中的值提供不同的內容，請考慮使用 [UseOriginCacheControlHeaders](#managed-cache-policy-origin-cache-headers)。

使用 CloudFormation AWS CLI、 或 CloudFront API 時，此政策的 ID 為：

`4cc15a8a-d715-48a4-82b8-cc0b614638fe`

此政策包括下列設定：
+ **最小 TTL：**0 秒
+ **最長 TTL：**31,536,000 秒 (365 天)
+ **預設 TTL：**0 秒
+ **快取金鑰中包含的標頭：**
  + `Host`
  + `Origin`
  + `X-HTTP-Method-Override`
  + `X-HTTP-Method`
  + `X-Method-Override`

  由於已啟用快取壓縮物件設定，因此也會包含標準化的 `Accept-Encoding` 標頭。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **快取金鑰中包含的 Cookie：**所有 Cookie 都包含在內。
+ **快取金鑰中包含的查詢字串：**包含所有查詢字串。
+ **快取壓縮物件設定：**已啟用。如需詳細資訊，請參閱[壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

# 了解快取金鑰
<a name="understanding-the-cache-key"></a>

*快取金鑰*會決定對 CloudFront 節點的檢視器請求是否會導致*快取命中*。快取金鑰是快取中物件的唯一識別碼。快取中的每個物件都有唯一的快取金鑰。

當檢視器請求產生與先前請求相同的快取金鑰，且該快取金鑰的物件位於節點的快取中且有效時，就會發生快取命中。當有快取命中時，請求的物件會從 CloudFront 節點提供給檢視器，這具有下列優點：
+ 降低原始伺服器的負載
+ 減少檢視器的延遲

當您的*快取命中率* 較高 (造成快取命中率較高的檢視器請求比例較高時)，您可以從網站或應用程式獲得較佳的效能。改善快取命中率的一種方法是，只在快取金鑰中包含必要的最小值。如需詳細資訊，請參閱下列區段。

您可以使用[快取政策](controlling-the-cache-key.md)來修改快取金鑰中的值 (URL 查詢字串、HTTP 標頭和 Cookie)。(您也可以在檢視器請求上使用 [Lambda@Edgefunction](lambda-at-the-edge.md) 或 [CloudFront Function](cloudfront-functions.md) 來修改快取金鑰。) 在修改快取金鑰之前，請務必瞭解應用程式的設計方式，以及根據檢視器請求的特性提供不同的回應的時間和方式。當查看器請求中的值確定您的來源返回的回應時，您應該在快取金鑰中包含該值。但是，如果您在快取金鑰中包含一個不影響您來源返回的回應值，則最終可能會快取重複的物件。

## 預設快取金鑰
<a name="cache-key-default"></a>

根據預設，CloudFront 分佈的快取金鑰包含下列資訊：
+ CloudFront 分佈的網域名稱 (例如 d111111abcdef8.cloudfront.net)
+ 請求物件的 URL 路徑 (例如 `/content/stories/example-story.html`)

**注意**  
`OPTIONS` 方法中包含在 `OPTIONS` 請求的快取金鑰中。這表示，`OPTIONS` 請求的回应會與 `GET` 和 `HEAD` 請求的回应分开快取。

依預設，來自檢視者請求的其他值不會包含在快取金鑰中。考慮從 Web 瀏覽器下面的 HTTP 請求。

```
            GET /content/stories/example-story.html?ref=0123abc&split-pages=false HTTP/1.1
            Host: d111111abcdef8.cloudfront.net
            User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/68.0
            Accept: text/html,*/*
            Accept-Language: en-US,en
            Cookie: session_id=01234abcd
            Referer: https://news.example.com/
```

當像此範例的檢視者請求進入 CloudFront 邊緣節點時，CloudFront 會使用快取金鑰來判斷是否存在快取命中。根據預設，只有下列請求元件包含在快取金鑰中：`/content/stories/example-story.html` 和 `d111111abcdef8.cloudfront.net`。如果請求的物件不在快取中 (快取遺漏)，則 CloudFront 會將請求發送到原點以獲取物件。取得物件後，CloudFront 會將其傳回檢視器，並將其儲存在節點的快取中。

當 CloudFront 收到相同物件的另一個請求時，由快取金鑰決定，會立即將快取物件 CloudFront 提供給檢視器，而不會將請求傳送給原始物件。例如，請考慮下列的 HTTP 請求在先前的請求之後進入。

```
            GET /content/stories/example-story.html?ref=xyz987&split-pages=true HTTP/1.1
            Host: d111111abcdef8.cloudfront.net
            User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/83.0.4103.116
            Accept: text/html,*/*
            Accept-Language: en-US,en
            Cookie: session_id=wxyz9876
            Referer: https://rss.news.example.net/
```

此請求適用於與先前請求相同的物件，但與先前請求不同。它具有不同的 URL 查詢字串，不同的 `User-Agent` 和 `Referer` 標頭，以及不同的 `session_id` Cookie。但是，根據預設，這些值都不是快取金鑰的一部分，因此第二個請求會導致快取命中。

## 自訂快取金鑰
<a name="cache-key-custom"></a>

在某些情況下，您可能想要在快取金鑰中包含更多資訊，即使這樣做可能會導致較少的快取點擊次數。您可以使用[快取政策](controlling-the-cache-key.md)指定要包含在快取金鑰中的內容。

例如，如果您的原始伺服器使用檢視器請求中的 `Accept-Language` HTTP 標頭，根據檢視器的語言傳回不同的內容，您可能需要將此標頭包含在快取金鑰中。當您這樣做時，CloudFront 會使用此標頭來確定快取命中，並在*原始伺服器請求*中包含標頭 (當有快取遺漏時，CloudFront 發送到原始伺服器請求的請求)。

在快取金鑰中包含其他值的可能一種結果是，最終 CloudFront 可能會因為檢視器請求中可能發生的變化而快取重複的物件。例如，檢視者可能會針對 `Accept-Language` 標頭傳送下列任何值：
+ `en-US,en`
+ `en,en-US`
+ `en-US, en`
+ `en-US`

所有這些不同的值都表示檢視器的語言是英文，但變化可能會導致 CloudFront 多次快取相同的物件。這可以減少快取命中並增加原始伺服器請求的數目。您可以避免這種重複，方法是不要在快取金鑰中包含 `Accept-Language` 標頭，而是將網站或應用程式設定為針對不同語言的內容使用不同的 URL (例如 `/en-US/content/stories/example-story.html`)。

對於您想要包含在快取金鑰中的任何指定值，您應該確定您瞭解該值的多少種不同變化可能會出現在檢視器請求中。對於某些請求值，將它們包含在快取金鑰中很少具有意義。例如，`User-Agent` 標頭可以有數千個獨特的變化，所以通常不會是要包含在快取金鑰中的候選項。具有使用者特定或工作階段特定值，以及在數千個 (甚至數百萬個) 請求中是唯一的 Cookie，也不適合包含快取金鑰的候選項。如果您在快取金鑰中包含這些值，每個唯一變化都會產生快取中物件的另一個副本。如果物件的這些副本不是唯一的，或者如果您最終得到如此大量稍微不同的物件，每個物件只會得到少量的快取命中，您可能需要考慮不同的方法。您可以從快取金鑰中排除這些高變數值，也可以將物件標示為不可快取。

自訂快取金鑰時請小心。有時候這是可取的，但它可能會產生意想不到的後果，例如快取重複的物件，降低快取命中率以及增加原始伺服器請求的數量。如果您的來源網站或應用程式需要從檢視器請求接收分析、遙測或其他用途的特定值，但這些值不會變更來源傳回的物件，請使用[原始伺服器請求政策](controlling-origin-requests.md)將這些值包含在原始伺服器請求中，但*不會*將它們包含在快取金鑰中。