根據請求標頭快取內容 - Amazon CloudFront

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

根據請求標頭快取內容

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

標頭和分佈 - 概觀

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

您可以設定 CloudFront 轉送標頭到原始伺服器,這讓 CloudFront 根據一個或多個請求標頭中的值來快取多個物件版本。要設定 CloudFront 根據特定標頭的值來快取物件,您可以為您的分佈指定快取行為設定。如需詳細資訊,請參閱根據選取的請求標頭執行快取

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

您可以在分佈中設定每個快取行為,以執行以下其中一項:

  • 轉送所有標頭到原始伺服器

    注意

    對於舊版快取設定 – 如果您設定 CloudFront 將所有標頭轉送到原始伺服器,則 CloudFront 不會快取與此快取行為關聯的物件。反之,它會傳送每個請求到原始伺服器。

  • 轉送您指定的標頭清單。CloudFront 根據所有指定標頭中的值來快取物件。CloudFront 也轉送預設情況下轉送的標頭,但只根據您指定的標頭來快取物件。

  • 只轉送預設標頭。這個組態中,CloudFront 根據請求標頭中的值不會快取物件。

如需有關針對每個快取行為轉送單的標頭數量的目前配額,或是有關請求更高配額的詳細資訊,請參閱 標頭的配額

如需有關使用 CloudFront 主控台來更新分佈,讓 CloudFront 能轉送標頭到原始伺服器的詳細資訊,請參閱更新分佈。如需有關使用 CloudFront API 更新現有分佈的資訊,請參閱 Amazon CloudFront API 參考中的更新分佈

選取要在 基礎上快取的標頭

您可以轉送到原始伺服器且 CloudFront 可基礎快取的標頭,取決於您的原始伺服器是 Amazon S3 儲存貯體還是自訂原始伺服器。

  • Amazon S3 – 您可以設定 CloudFront 根據多個特定標頭轉送機快取物件 (請參閱下列例外狀況清單)。不過,我們建議您避免轉送具有 Amazon S3 原始伺服器的標頭,除非您需要實作跨來源資源共享 (CORS),或是想要在原始伺服器面向事件中使用 Lambda@Edge 將內容個人化。

    • 若要設定 CORS,您必須轉送標頭,以允許 CloudFront 為已啟用跨來源資源共享 (CORS) 的網站分佈內容。如需更多詳細資訊,請參閱 設定 CloudFront 以遵守 CORS 設定

    • 若要使用您轉發至 Amazon S3 原始伺服器的標頭將內容個人化,請編寫並新增 Lambda@Edge 函數,並將其與要由原始伺服器面向的事件所觸發的 CloudFront 分佈相關聯。如需使用標頭來個人化內容的詳細資訊,請參閱根據國家/地區或裝置類型標頭個人化 - 範例

      我們建議您避免轉送沒有要用來個人化內容的標頭,因為轉送額外的標頭可能會降低您的快取命中率。也就是說,CloudFront 無法將那麼多來自節點快取的請求做為所有請求的一部分來處理。

  • 自訂原始伺服器 - 您可以設定 CloudFront 根據下列之外的任何請求標頭值來執行快取:

    • Connection

    • Cookie - 如果要根據 Cookie 來轉送及快取,您可以在分佈中使用個別的設定。如需更多詳細資訊,請參閱 根據 Cookie 快取內容

    • Host (for Amazon S3 origins)

    • Proxy-Authorization

    • TE

    • Upgrade

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

如需 HTTP 請求標頭的完整清單,以及 CloudFront 處理這些標頭的方式,請參閱 HTTP 請求標頭和 CloudFront 行為 (自訂和 Amazon S3 原始伺服器)

設定 CloudFront 以遵守 CORS 設定

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

Amazon Simple Storage Service (Amazon S3)

  • 如果您希望快取 OPTIONS 回應,請執行下列動作:

    • 選擇預設快取行為設定的選項,來啟用 OPTIONS 回應的快取。

    • 設定 CloudFront 轉送以下標頭:OriginAccess-Control-Request-HeadersAccess-Control-Request-Method

  • 如果您不要快取 OPTIONS 回應,請設定 CloudFront 將 Origin 標頭以及原始伺服器所需的任何其他標頭一起轉送 (例如,Access-Control-Request-HeadersAccess-Control-Request-Method 或其他)。

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

若要設定 CloudFront 以根據 CORS 快取回應,您必須使用快取政策設定 CloudFront 轉送標頭。如需詳細資訊,請參閱使用政策控制快取金鑰

如需 CORS 和 Amazon S3 的詳細資訊,請參閱 Amazon Simple Storage Service 使用者指南中的使用跨來源資源分享 (CORS)

根據裝置類型設定快取

如果您要讓 CloudFront 根據使用者使用以檢視內容的裝置來快取不同的物件版本,請設定 CloudFront 來轉送適用標頭到自訂原始伺服器:

  • CloudFront-Is-Desktop-Viewer

  • CloudFront-Is-Mobile-Viewer

  • CloudFront-Is-SmartTV-Viewer

  • CloudFront-Is-Tablet-Viewer

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

根據檢視器的語言設定快取

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

根據檢視器的位置設定快取

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

根據請求的通訊協定設定快取

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

設定壓縮檔案的快取

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

快取如何根據標頭影響效能

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

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

標頭大小寫和標頭值如何影響快取

當 CloudFront 根據標頭值快取時,不會考慮標頭名稱的大小寫,但會考慮標頭值的大小寫:

  • 如果檢視器請求包含 Product:Acmeproduct:Acme,CloudFront 只會快取物件一次。它們之間的唯一差別是不會影響快取的標頭大小寫。

  • 如果檢視器請求同時包含 Product:AcmeProduct:acme,CloudFront 會快取物件兩次,因為有一些請求中的值是 Acme,而其他請求中的值則是 acme

CloudFront 傳回給檢視器的標頭

設定 CloudFront 來轉送和快取標頭不會影響 CloudFront 傳回哪一個標頭給檢視器。CloudFront 傳回它從原始伺服器取得的標頭,有幾個例外狀況。如需詳細資訊,請參閱適用的主題: