

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

# 了解快取金鑰
<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)將這些值包含在原始伺服器請求中，但*不會*將它們包含在快取金鑰中。