根據要求標頭快取內容 - 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轉發到原點的信息,請參閱更新分佈。如需使用更新現有分發的相關資訊,請參閱 Amazon CloudFront API 參考中的更新分發。 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 來轉送及快取,您可以在分佈中使用個別的設定。如需詳細資訊,請參閱根據餅乾緩存內容

    • 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 簡單儲存服務使用者指南中的使用跨來源資源共用 (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 列表,請參閱維基百科條目 ISO316 6-1 α-2。

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

如果 CloudFront 要根據請求的協議緩存對象的不同版本HTTPS,HTTP或者配置 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 返回它從原點獲得的所有標題,但有一些例外。如需詳細資訊,請參閱適用的主題: