

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

# 了解快取政策
<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 標頭。