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

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

根據請求標頭快取內容

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

標頭和分佈 - 概觀

根據預設,在邊緣位置快取物件時, CloudFront 不會考慮標頭。如果您的 origin 傳回兩個物件,而且它們只與要求標頭中的值不同,則只會 CloudFront 快取物件的一個版本。

您可以設定 CloudFront 將標頭轉寄至來源,這會 CloudFront 根據一或多個要求標頭中的值,快取物件的多個版本。要設定 CloudFront 根據特定標頭的值來快取物件,您可以為您的分佈指定快取行為設定。如需詳細資訊,請參閱根據選取的請求標頭執行快取

例如,假設 logo.jpg 的檢視器請求包含具有 ProductAcme 值的客戶 Apex 標頭。當您設定 CloudFront 為根據Product標頭的值快取物件時,會將要求 CloudFront 轉寄logo.jpg至 origin,並包含標Product頭和標頭值。 CloudFront 針對Product標頭值所在的要求快取logo.jpg一次,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-Headers、和Access-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 設置為true或轉發請求到您的來源false之前。如果裝置屬於多個類別,一個以上的值可能是 true。例如,對於某些平板電腦裝置, CloudFront 可能會同時CloudFront-Is-Tablet-ViewerCloudFront-Is-Mobile-Viewer和設定為true

根據檢視器語言設定快取

如果您想 CloudFront 要根據要求中指定的語言快取物件的不同版本,請設定將Accept-Language標頭轉寄 CloudFront 至您的來源。

根據檢視器位置設定快取

如果您想 CloudFront 要根據要求來自的國家/地區快取物件的不同版本,請設定 CloudFront 將CloudFront-Viewer-Country標頭轉寄至您的來源。 CloudFront 自動將要求來自的 IP 位址轉換為兩個字母的國家/地區代碼。有關可按代碼和國家/地區名稱排序的國家/地區代碼 easy-to-use 列表,請參閱維基百科條目 ISO 316 6-1 α-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 返回它從原點獲得的所有標題,但有一些例外。如需詳細資訊,請參閱適用的主題: