管理內容在快取中停留的時間 (過期) - Amazon CloudFront

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

管理內容在快取中停留的時間 (過期)

您可以控制在 CloudFront 將另一個請求轉送至原始伺服器之前,檔案在 CloudFront 快取中停留的時間。降低持續時間允許您提供動態內容。增加持續時間表示您的使用者取得更好的效能,因為檔案更有可能是直接透過節點快取提供。較長的持續時間也能減少的原始伺服器的負載。

一般而言,CloudFront 從節點提供檔案,直到您指定的快取持續時間已經達到,亦即直到檔案過期。過期之後,下次邊緣節點取得檔案的使用者請求時,CloudFront 會將請求轉送到原始伺服器來驗證快取是否包含檔案的最新版本。來自原始伺服器的回應取決於檔案是否已變更:

  • 如果 CloudFront 快取已經有最新版本,則原始伺服器傳回狀態碼 304 Not Modified

  • 如果 CloudFront 快取沒有最新的版本,則原始伺服器會傳回一個狀態碼 200 OK 和檔案的最新版本。

如果節點中的物件未被頻繁請求,CloudFront 可能會移出該檔案 (在檔案過期日期前移除檔案),以將足夠的空間提供給最近被請求的檔案。

我們建議您透過更新分佈的快取政策來管理快取持續時間。如果您選擇不使用快取政策,預設 TTL (存留時間) 為 24 小時,但您可以更新下列設定來覆寫預設值:

  • 若要為符合相同路徑模式的所有檔案變更快取持續期間,您可以變更快取行為的 Minimum TTL (最小 TTL)Maximum TTL (最大 TTL),以及 Default TTL (預設 TTL) CloudFront 設定。如需個別設定的相關資訊,請參閱所有分佈設定參考中的最小 TTL最大 TTL,以及預設 TTL

  • 若要變更個別檔案的快取持續期間,您可以設定原始伺服器來使用 max-ages-maxage 指示詞將 Cache-Control 標頭,或是 Expires 標頭欄位新增到檔案。如需詳細資訊,請參閱使用標頭來控制個別物件的快取持續時間

如需有關 Minimum TTL (最短 TTL)Default TTL (預設 TTL)Maximum TTL (最長 TTL)max-ages-maxage 命令及 Expires 標頭欄位互動方式的詳細資訊,請參閱 指定 CloudFront 快取物件的時間量

您也可以控制錯誤 (例如 404 Not Found) 在 CloudFront 快取中保留多久時間,然後 CloudFront 將再試一次藉由轉送另一個請求至原始伺服器以取得請求的物件。如需詳細資訊,請參閱CloudFront 如何處理來自原始伺服器的 HTTP 4xx 和 5xx 狀態碼

使用標頭來控制個別物件的快取持續時間

您可以使用 Cache-ControlExpires 標頭來控制物件在快取中保持多久的時間。Minimum TTL (最短 TTL)Default TTL (預設 TTL)Maximum TTL (最長 TTL) 的設定也會影響快取持續時間,但以下是標頭會如何影響快取持續時間的概觀:

  • Cache-Control max-age 指令可讓您指定您想要物件在快取中維持多久的時間 (以秒為單位),然後 CloudFront 從原始伺服器再次取得物件。CloudFront 支援的最短到期時間是 0 秒。最長值為 100 年。請在下列格式中指定值:

    Cache-Control: max-age=

    例如,下列指令告訴 CloudFront 在快取中維持關聯的物件 3600 秒 (1 小時):

    Cache-Control: max-age=3600

    如果您想要物件在 CloudFront 節點快取中保持的持續時間不同於在瀏覽器快取中保持的,您可以 Cache-Control max-ageCache-Control s-maxage 指令併用。如需更多詳細資訊,請參閱 指定 CloudFront 快取物件的時間量

  • Expires 標頭欄位可讓您使用 RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1 Section 3.3.1, Full Date 中指定的格式來指定過期日期和時間,例如:

    Sat, 27 Jun 2015 23:59:59 GMT

我們建議您使用 Cache-Control max-age 指令,而不是 Expires 標頭欄位來控制物件快取。如果您同時為 Cache-Control max-ageExpires 指定值,則 CloudFront 僅使用 Cache-Control max-age 的值。

如需更多詳細資訊,請參閱 指定 CloudFront 快取物件的時間量

您不能使用 HTTP Cache-Control 或來自檢視者的 Pragma 請求的 GET 標頭欄位,來強制 CloudFront 返回物件的原始伺服器。CloudFront 忽略檢視者請求中的這些標頭欄位。

如需有關 Cache-ControlExpires 標頭欄位的詳細資訊,請參閱 RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1 中的以下各節:

提供過時 (過期) 內容

CloudFront 支援 Stale-While-RevalidateStale-If-Error 快取控制指令。您可以使用這些指令來指定檢視器可使用過時內容的時間長度。

Stale-While-Revalidate

此指令允許 CloudFront 從快取提供過時的內容,而 CloudFront 則非同步地從原始伺服器擷取新版本。當瀏覽者從節點接收回應時,這可改善延遲,而不必等待背景擷取。新內容會載入背景以供未來請求使用。

範例:Stale-While-Revalidate

當您將 Cache-Control標頭設定為使用這些指令時,CloudFront 會執行下列動作。

Cache-Control: max-age=3600, stale-while-revalidate=600
  1. CloudFront 會將回應快取一小時 (max-age=3600)。

  2. 如果在此持續時間之後提出請求,CloudFront 會提供過時的內容,同時將請求傳送至原始伺服器以重新驗證和重新整理快取的內容。

  3. 在重新驗證內容時,CloudFront 最多提供 10 分鐘的過時內容 (stale-while-revalidate=600)。

注意

CloudFront 會將過時的內容提供至stale-while-revalidate指令的值或 CloudFront 最大 TTL 的值,以較小者為準。在最長 TTL 持續時間之後,無論stale-while-revalidate值為何,都不會從節點快取提供過時的物件。

Stale-If-Error

如果無法連線原始伺服器或傳回介於 500 和 600 之間的錯誤碼,此指令可讓 CloudFront 從快取提供過時的內容。這可確保檢視者即使在原始伺服器中斷期間也能存取內容。

範例:Stale-If-Error

當您將 Cache-Control標頭設定為使用這些指令時,CloudFront 會執行下列動作。

Cache-Control: max-age=3600, stale-if-error=86400
  1. CloudFront 快取回應一小時 (max-age=3600)。

  2. 如果原始伺服器在此持續時間後關閉或傳回錯誤,CloudFront 會繼續提供過時的內容長達 24 小時 (stale-if-error=86400)

  3. 如果您設定自訂錯誤回應,如果在指定的stale-if-error持續時間內發生錯誤,CloudFront 會嘗試提供過時的內容。如果過時的內容無法使用,CloudFront 會提供您為對應錯誤狀態碼設定的自訂錯誤回應。如需詳細資訊,請參閱產生自訂錯誤回應

備註
  • CloudFront 會將過時的內容提供至stale-if-error指令的值或 CloudFront 最大 TTL 的值,以較小者為準。在最長 TTL 持續時間之後,無論stale-if-error值為何,都不會從節點快取提供過時的物件。

  • 如果您未設定stale-if-error或自訂錯誤回應,CloudFront 會根據請求的物件是否在節點快取中,傳回過時的物件或將錯誤回應轉送回檢視器。如需詳細資訊,請參閱如果您尚未設定自訂錯誤頁面,CloudFront 如何處理錯誤

使用這兩個指令

stale-while-revalidatestale-if-error都是獨立的快取控制指令,您可以一起使用來減少延遲,並為您的原始伺服器新增緩衝區來回應或復原。

範例:使用這兩個指令

當您將 Cache-Control標頭設定為使用以下指令時,CloudFront 會執行下列動作。

Cache-Control: max-age=3600, stale-while-revalidate=600, stale-if-error=86400
  1. CloudFront 快取回應一小時 (max-age=3600)。

  2. 如果在此持續時間之後提出請求,CloudFront 會在重新驗證內容時提供過時的內容長達 10 分鐘 (stale-while-revalidate=600)。

  3. 如果原始伺服器在 CloudFront 嘗試重新驗證內容時傳回錯誤,CloudFront 將繼續提供過時的內容長達 24 小時 (stale-if-error=86400)。

快取是效能和更新狀態之間的平衡。使用類似 stale-while-revalidatestale-if-error 指令可增強效能和使用者體驗,但請確保組態與您希望內容的更新狀態保持一致。過時內容指令最適合需要重新整理內容但不需要最新版本的使用案例。此外,如果您的內容沒有變更或很少變更,stale-while-revalidate 可能會新增不必要的網路要求。反之,請考慮設定較長的快取持續時間。

指定 CloudFront 快取物件的時間量

若要控制 CloudFront 在傳送另一個請求至原始伺服器前將物件保留在快取中的時間,您可以:

  • 設定 CloudFront 分散式快取行為中的最短、最長和預設 TTL 值。您可以在連接至快取行為的快取政策 (建議使用) 或舊版快取設定中設定這些值。

  • 在來自原始伺服器的回應中包含 Cache-ControlExpires 標頭。這些標頭還有助於判定在傳送另一個請求到 CloudFront 之前,瀏覽器將物件保留在瀏覽器快取中的時間長度。

下表解釋了從原始伺服器傳送的 Cache-ControlExpires 標頭如何與快取行為中的 TTL 設定一起運作,以影響快取。

原始標頭 最短 TTL = 0 最短 TTL > 0

原始伺服器將 Cache-Control: max-age 指示詞新增至物件

CloudFront 快取

CloudFront 會針對 Cache-Control: max-age 指令值或 CloudFront 最大 TTL 值兩者之中較小的值快取物件。

瀏覽器快取

瀏覽器會快取 Cache-Control: max-age 指令值的物件。

CloudFront 快取

CloudFront 快取取決於 CloudFront 最小 TTL 與最大 TTL 及 Cache-Control max-age 指示詞的值:

  • 如果最小 TTL < max-age < 最大 TTL,則 CloudFront 會快取 Cache-Control: max-age 指令值的物件。

  • 如果 max-age < 最小 TTL,則 CloudFront 會快取 CloudFront 最小 TTL 值的物件。

  • 如果 max-age > 最大 TTL,則 CloudFront 會快取 CloudFront 最大 TTL 值的物件。

瀏覽器快取

瀏覽器會快取 Cache-Control: max-age 指令值的物件。

原始伺服器不會將 Cache-Control: max-age 指示詞新增至物件

CloudFront 快取

CloudFront 會快取 CloudFront 預設 TTL 值的物件。

瀏覽器快取

取決於瀏覽器。

CloudFront 快取

CloudFront 會針對 CloudFront 最小 TTL 值或預設 TTL 值兩者之中較大的值快取物件。

瀏覽器快取

取決於瀏覽器。

原始伺服器將 Cache-Control: max-ageCache-Control: s-maxage 指示詞新增至物件

CloudFront 快取

CloudFront 會針對 Cache-Control: s-maxage 指令值或 CloudFront 最大 TTL 值兩者之中較小的值快取物件。

瀏覽器快取

瀏覽器會快取 Cache-Control max-age 指令值的物件。

CloudFront 快取

CloudFront 快取取決於 CloudFront 最小 TTL 與最大 TTL 及 Cache-Control: s-maxage 指示詞的值:

  • 如果最小 TTL < s-maxage < 最大 TTL,則 CloudFront 會快取 Cache-Control: s-maxage 指令值的物件。

  • 如果 s-maxage < 最小 TTL,則 CloudFront 會快取 CloudFront 最小 TTL 值的物件。

  • 如果 s-maxage > 最大 TTL,則 CloudFront 會快取 CloudFront 最大 TTL 值的物件。

瀏覽器快取

瀏覽器會快取 Cache-Control: max-age 指令值的物件。

原始伺服器將 Expires 標頭新增至物件

CloudFront 快取

CloudFront 會快取物件直到 Expires 標頭中的日期或 CloudFront 最大 TTL 值,以先到者為準。

瀏覽器快取

瀏覽器會快取物件直到 Expires 標頭中的日期。

CloudFront 快取

CloudFront 快取取決於 CloudFront 最短 TTL 與最長 TTL 及 Expires 標頭的值:

  • 如果最小 TTL Expires < 最大 TTL,則 CloudFront 會快取物件,直到 Expires 標頭中的日期和時間為止。

  • 如果 Expires < 最小 TTL,則 CloudFront 會快取 CloudFront 最小 TTL 值的物件。

  • 如果 Expires > 最大 TTL,則 CloudFront 會快取 CloudFront 最大 TTL 值的物件。

瀏覽器快取

瀏覽器會快取物件直到 Expires 標頭中的日期與時間。

原始伺服器將 Cache-Control: no-cacheno-store 和/或 private 指示詞新增至物件

CloudFront 和瀏覽器遵守標頭。

CloudFront 快取

CloudFront 會快取 CloudFront 最小 TTL 值的物件。請參閱此資料表下方的警告。

瀏覽器快取

瀏覽器遵守標頭。

警告

如果您的最小 TTL 大於 0,CloudFront 會使用快取政策的最小 TTL,即使原始標頭中存在 Cache-Control: no-cacheno-store和/或 private指令。

如果原始伺服器可以存取,CloudFront 會從原始伺服器取得物件並將其傳回給檢視器。

如果無法連線原始伺服器,且最小最大 TTL 值大於 0,CloudFront 將提供先前從原始伺服器取得的物件。

為了避免這種行為,請將 Cache-Control: stale-if-error=0 指示詞與從原始伺服器傳回的物件一同包含。如果原始伺服器無法連線,這會導致 CloudFront 傳回錯誤以回應未來的請求,而不是傳回其之前從原始伺服器取得的物件。

如需有關如何使用 CloudFront 主控台變更分佈設定的詳細資訊,請參閱 更新分佈。如需有關如何使用 CloudFront API 為分佈變更設定的詳細資訊,請參閱 UpdateDistribution

使用 Amazon S3 主控台將標頭新增至物件

您可以將 Cache-ControlExpires標頭欄位新增至 Amazon S3 物件。若要這麼做,請修改物件的中繼資料欄位。

Cache-ControlExpires標頭欄位新增至 Amazon S3 物件
  1. 請遵循《Amazon S3 使用者指南》中 Amazon S3 主控台主題中編輯物件中繼資料取代系統定義的中繼資料一節中的程序。 Amazon S3

  2. 對於 Key (金鑰),選擇您要新增的標頭名稱 (Cache-Control (快取控制) 或 Expires (過期))。

  3. 對於 Value (值),輸入標頭值。例如,對於 Cache-Control 標題,您可以輸入 max-age=86400。對於 Expires,您可以輸入過期日期和時間,例如 Wed, 30 Jun 2021 09:28:00 GMT

  4. 請遵循其餘程序來儲存中繼資料變更。