

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

# 根據請求標頭快取內容
<a name="header-caching"></a>

CloudFront 讓您選擇是否要讓 CloudFront 將標頭轉送至原始伺服器，並根據檢視器請求中的標頭值，快取指定物件的個別版本。這可讓您根據使用者使用的裝置、檢視器的位置、檢視器使用的語言，以及各種其他條件，提供內容的不同版本。

**Topics**
+ [標頭和分佈 - 概觀](#header-caching-web)
+ [選取快取時所依據的標頭](#header-caching-web-selecting)
+ [設定 CloudFront 以遵循 CORS 設定](#header-caching-web-cors)
+ [根據裝置類型設定快取](#header-caching-web-device)
+ [根據檢視器語言設定快取](#header-caching-web-language)
+ [根據檢視器位置設定快取](#header-caching-web-location)
+ [根據請求的通訊協定設定快取](#header-caching-web-protocol)
+ [設定壓縮檔案的快取](#header-caching-web-compressed)
+ [快取如何根據標頭影響效能](#header-caching-web-performance)
+ [標頭大小寫和標頭值如何影響快取](#header-caching-web-case)
+ [CloudFront 傳回給檢視器的標頭](#header-caching-web-response)

## 標頭和分佈 - 概觀
<a name="header-caching-web"></a>

在預設情況下，CloudFront 在節點中快取物件時不會考慮標頭。如果原始伺服器傳回兩個物件，且只有請求標頭中的值不同，則 CloudFront 只快取一個物件版本。

您可以設定 CloudFront 轉送標頭到原始伺服器，這讓 CloudFront 根據一個或多個請求標頭中的值來快取多個物件版本。要設定 CloudFront 根據特定標頭的值來快取物件，您可以為您的分佈指定快取行為設定。如需詳細資訊，請參閱[根據選取的請求標頭執行快取](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesForwardHeaders)。

例如，假設 `logo.jpg` 的檢視器請求包含具有 `Product` 或 `Acme` 值的客戶 `Apex` 標頭。當您設定 CloudFront 根據 `Product` 標頭值快取物件時，CloudFront 會轉送 `logo.jpg` 的請求到原始伺服器，並包含 `Product` 標頭和標頭值。CloudFront 為請求中 `logo.jpg` 標頭值為 `Product` 與請求中值為 `Acme` 各快取 `Apex` 一次。

您可以在分佈中設定每個快取行為，以執行以下其中一項：
+ 轉送所有標頭到原始伺服器
**注意**  
**對於舊版快取設定** – 如果您設定 CloudFront 將所有標頭轉送到原始伺服器，則 CloudFront 不會快取與此快取行為關聯的物件。反之，它會傳送每個請求到原始伺服器。
+ 轉送您指定的標頭清單。CloudFront 根據所有指定標頭中的值來快取物件。CloudFront 也轉送預設情況下轉送的標頭，但只根據您指定的標頭來快取物件。
+ 只轉送預設標頭。這個組態中，CloudFront 根據請求標頭中的值不會快取物件。

如需有關針對每個快取行為轉送單的標頭數量的目前配額，或是有關請求更高配額的詳細資訊，請參閱 [標頭的配額](cloudfront-limits.md#limits-custom-headers)。

如需有關使用 CloudFront 主控台來更新分佈，讓 CloudFront 能轉送標頭到原始伺服器的詳細資訊，請參閱[更新分佈](HowToUpdateDistribution.md)。如需有關使用 CloudFront API 更新現有分佈的資訊，請參閱 *Amazon CloudFront API 參考*中的[更新分佈](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。

## 選取快取時所依據的標頭
<a name="header-caching-web-selecting"></a>

您可以轉送到原始伺服器且 CloudFront 可基礎快取的標頭，取決於您的原始伺服器是 Amazon S3 儲存貯體還是自訂原始伺服器。
+ **Amazon S3 – **您可以設定 CloudFront 根據多個特定標頭轉送機快取物件 (請參閱下列例外狀況清單)。不過，我們建議您避免轉送具有 Amazon S3 原始伺服器的標頭，除非您需要實作跨來源資源共享 (CORS)，或是想要在原始伺服器面向事件中使用 Lambda@Edge 將內容個人化。
  + 若要設定 CORS，您必須轉送標頭，以允許 CloudFront 為已啟用跨來源資源共享 (CORS) 的網站分佈內容。如需更多詳細資訊，請參閱 [設定 CloudFront 以遵循 CORS 設定](#header-caching-web-cors)。
  + 若要使用您轉發至 Amazon S3 原始伺服器的標頭將內容個人化，請編寫並新增 Lambda@Edge 函數，並將其與要由原始伺服器面向的事件所觸發的 CloudFront 分佈相關聯。如需使用標頭來個人化內容的詳細資訊，請參閱[根據國家/地區或裝置類型標頭個人化 - 範例](lambda-examples.md#lambda-examples-redirecting-examples)。

    我們建議您避免轉送沒有要用來個人化內容的標頭，因為轉送額外的標頭可能會降低您的快取命中率。也就是說，CloudFront 無法將那麼多來自節點快取的請求做為所有請求的一部分來處理。
+ **自訂原始伺服器** - 您可以設定 CloudFront 根據下列之外的任何請求標頭值來執行快取：
  + `Connection`
  + `Cookie` - 如果要根據 Cookie 來轉送及快取，您可以在分佈中使用個別的設定。如需更多詳細資訊，請參閱 [根據 Cookie 快取內容](Cookies.md)。
  + `Host (for Amazon S3 origins)`
  + `Proxy-Authorization`
  + `TE`
  + `Upgrade`

  您可以設定 CloudFront 根據 `Date` 與 `User-Agent` 標頭中的值來快取物件，但我們不建議這麼做。這些標頭有許多可能的值，且根據其值來快取可能導致 CloudFront 轉送更多請求到原始伺服器。

如需 HTTP 請求標頭的完整清單，以及 CloudFront 處理這些標頭的方式，請參閱 [HTTP 請求標頭和 CloudFront 行為 (自訂和 Amazon S3 原始伺服器)](RequestAndResponseBehaviorCustomOrigin.md#request-custom-headers-behavior)。

## 設定 CloudFront 以遵循 CORS 設定
<a name="header-caching-web-cors"></a>

如果您已在 Amazon S3 儲存貯體或自訂原始伺服器上啟用跨來源資源共享 (CORS)，您必須選擇特定的標頭進行轉發，以遵守 CORS 設定。您必須轉發的標頭會因原始伺服器 (Amazon S3 或自訂)，以及您是否要快取 `OPTIONS` 回應而異。

**Amazon S3**
+ 如果您希望快取 `OPTIONS` 回應，請執行下列動作：
  + 選擇預設快取行為設定的選項，來啟用 `OPTIONS` 回應的快取。
  + 設定 CloudFront 轉送以下標頭：`Origin`、`Access-Control-Request-Headers` 及 `Access-Control-Request-Method`。
+ 如果您不要快取 `OPTIONS` 回應，請設定 CloudFront 將 `Origin` 標頭以及原始伺服器所需的任何其他標頭一起轉送 (例如，`Access-Control-Request-Headers`、`Access-Control-Request-Method` 或其他)。

**自訂原始伺服器** - 轉送 `Origin` 標頭與原始伺服器需要的其他任何標頭。

若要設定 CloudFront 以根據 CORS 快取回應，您必須設定 CloudFront 以使用快取政策轉送標頭。如需詳細資訊，請參閱[使用政策控制快取金鑰](controlling-the-cache-key.md)。

如需 CORS 和 Amazon S3 的詳細資訊，請參閱 *Amazon Simple Storage Service 使用者指南*中的[使用跨來源資源分享 (CORS)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/cors.html)。

## 根據裝置類型設定快取
<a name="header-caching-web-device"></a>

如果您要讓 CloudFront 根據使用者使用以檢視內容的裝置來快取不同的物件版本，請設定 CloudFront 來轉送適用標頭到自訂原始伺服器：
+ `CloudFront-Is-Desktop-Viewer`
+ `CloudFront-Is-Mobile-Viewer`
+ `CloudFront-Is-SmartTV-Viewer`
+ `CloudFront-Is-Tablet-Viewer`

根據 `User-Agent` 標頭值，CloudFront 將這些標頭值設定為 `true` 或 `false`，然後將請求轉送至原始伺服器。如果裝置屬於多個類別，一個以上的值可能是 `true`。例如，針對一些平板電腦裝置，CloudFront 可能將 `CloudFront-Is-Mobile-Viewer` 與 `CloudFront-Is-Tablet-Viewer` 同時設定為 `true`。

## 根據檢視器語言設定快取
<a name="header-caching-web-language"></a>

如果您要讓 CloudFront 根據請求中指定的語言，快取物件的不同版本，請設定 CloudFront 轉送 `Accept-Language` 標頭至原始伺服器。

## 根據檢視器位置設定快取
<a name="header-caching-web-location"></a>

如果您要讓 CloudFront 根據請求來源國快取物件的不同版本，請設定 CloudFront 轉送 `CloudFront-Viewer-Country` 標頭至原始伺服器。CloudFront 自動轉換來自兩個字母國家/地區代碼請求的 IP 位址。如需可依據代碼與國家/地區名稱排序的國家/地區代碼易用清單，請參閱 Wikipedia 項目 [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)。

## 根據請求的通訊協定設定快取
<a name="header-caching-web-protocol"></a>

如果您要讓 CloudFront 根據請求的通訊協定 HTTP 或 HTTPS 來快取物件的不同版本，請設定 CloudFront 將 `CloudFront-Forwarded-Proto` 標頭轉送至原始伺服器。

## 設定壓縮檔案的快取
<a name="header-caching-web-compressed"></a>

如果您的原始伺服器支援 Brotli 壓縮，您可以根據 `Accept-Encoding` 標頭快取。只有在您的原始伺服器根據標頭提供不同內容時，才應根據 `Accept-Encoding` 設定快取。

## 快取如何根據標頭影響效能
<a name="header-caching-web-performance"></a>

當您設定 CloudFront 根據一或多個標頭和有一個以上可能值的標頭來快取時，CloudFront 轉送多個請求到相同物件的原始伺服器。這會降低效能和增加原始伺服器的負載。如果原始伺服器不管指定標頭值傳回相同物件，我們建議您不要設定 CloudFront 根據該標頭快取。

如果您設定 CloudFront 轉送多個標頭，則檢視器請求中的標頭順序只要值一樣，便不會影響快取。例如，如果一個請求包含標頭 A:1、B:2 和另一個請求包含 B:2、A:1，則 CloudFront 只快取一個物件副本。

## 標頭大小寫和標頭值如何影響快取
<a name="header-caching-web-case"></a>

當 CloudFront 根據標頭值快取時，不會考慮標頭名稱的大小寫，但會考慮標頭值的大小寫：
+ 如果檢視器請求包含 `Product:Acme` 和 `product:Acme`，CloudFront 只會快取物件一次。它們之間的唯一差別是不會影響快取的標頭大小寫。
+ 如果檢視器請求同時包含 `Product:Acme` 與 `Product:acme`，CloudFront 會快取物件兩次，因為有一些請求中的值是 `Acme`，而其他請求中的值則是 `acme`。

## CloudFront 傳回給檢視器的標頭
<a name="header-caching-web-response"></a>

設定 CloudFront 來轉送和快取標頭不會影響 CloudFront 傳回哪一個標頭給檢視器。CloudFront 傳回它從原始伺服器取得的標頭，有幾個例外狀況。如需詳細資訊，請參閱適用的主題：
+ **Amazon S3 原始伺服器 - ** 請參閱[CloudFront 移除或更新的 HTTP 回應標頭](RequestAndResponseBehaviorS3Origin.md#response-s3-removed-headers)。
+ **自訂原始伺服器 - **請參閱[CloudFront 移除或取代的 HTTP 回應標頭](RequestAndResponseBehaviorCustomOrigin.md#ResponseCustomRemovedHeaders)。