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

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

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

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

一般而言,會從邊緣位置 CloudFront 提供檔案,直到您指定傳遞的快取持續時間為止 — 也就是說,直到檔案過期為止。到期後,下次邊緣位置取得檔案的要求時,會將要求 CloudFront 轉送至原始位置,以確認快取是否包含檔案的最新版本。來自原始伺服器的回應取決於檔案是否已變更:

  • 如果 CloudFront 快取已經有最新版本,來源會傳回狀態碼304 Not Modified

  • 如果 CloudFront 快取沒有最新版本,來源會傳回狀態碼200 OK和檔案的最新版本。

如果不經常要求邊緣位置中的檔案, CloudFront 可能會收回檔案 (在檔案到期日之前移除檔案),以便為最近要求的檔案騰出空間。

根據預設,每個檔案會自動在 24 小時候過期,但您可以透過兩種方式變更預設行為:

  • 若要變更符合相同路徑模式的所有檔案的快取持續時間,您可以針對快取行為變更「最小 TTL」、「最大 TTL」和「預 CloudFront 設 TTL」的設定。如需個別設定的相關資訊,請參閱發佈設定參考中的最小 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 秒(一小時):

    Cache-Control: max-age=3600

    如果您希望物件停留在 CloudFront Edge 快取中的持續時間與停留在瀏覽器快取記憶體中的持續時間不同,可以一起使用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-age和指定值Expires,則僅CloudFront 使用的值Cache-Control max-age

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

您無法在檢視器的GET要求中使用 HTTP Cache-ControlPragma標頭欄位 CloudFront 來強制返回物件的原始伺服器。 CloudFront 會忽略檢視器要求中的這些標頭欄位。

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

提供過時(過期)內容

CloudFront 支持Stale-While-RevalidateStale-If-Error緩存控制指令。

  • stale-while-revalidate指令 CloudFront 允許從緩存中提供過時的內容,同時從原始異步獲取新版本。這可改善延遲時間,因為使用者會立即從 CloudFront邊緣位置接收回應,而無需等待背景擷取,而且會在背景中載入新內容以供 future 要求使用。

    在下列範例中, CloudFront 快取回應一小時 (max-age=3600)。如果在此期間之後發出請求,則會在同時向來源發送請求以重新驗證和重新整理緩存內容的同時CloudFront 提供過時內容的內容。過時內容最多可提供 10 分鐘 (stale-while-revalidate=600),同時內容會被重新驗證。

    Cache-Control: max-age=3600, stale-while-revalidate=600
  • 如果來源無法訪問,或返回介於 500 和 600 之間的錯誤代碼,該stale-if-error指令允許 CloudFront 從緩存中提供過時的內容。這可確保檢視者即使在原始伺服器中斷期間也能存取內容。

    在下列範例中, CloudFront 快取回應一小時 (max-age=3600)。如果來源已關閉或在此期間之後傳回錯誤,則會 CloudFront 持續為過時內容提供長達 24 小時 (stale-if-error=86400)。

    Cache-Control: max-age=3600, stale-if-error=86400
    注意

    同時設定stale-if-error自訂錯誤回應時,如果在指定的stale-if-error持續時間內發生錯誤, CloudFront 首先會嘗試提供過時內容。如果無法使用過時內容,或內容超出stale-if-error持續時間,則會 CloudFront 提供針對對應錯誤狀態碼設定的自訂錯誤回應。

兩者一起使用

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

在下列範例中, CloudFront 快取回應一小時 (max-age=3600)。如果在此期間之後提出要求,則在重新驗證內容時,最多可CloudFront 提供 10 分鐘的過時內容 (stale-while-revalidate=600)。如果原始伺服器在 CloudFront 嘗試重新驗證內容時傳回錯誤,則會 CloudFront 持續提供過時內容長達 24 小時 () stale-if-error=86400

Cache-Control: max-age=3600, stale-while-revalidate=600, 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標頭中的日期或 TTL 上 CloudFront限值 (以較早者為準)。

瀏覽器快取

瀏覽器會快取物件直到 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 使來源標頭中有、和/或private指令,也會Cache-Control: no-cache使用快取原則的最小 TTL。no-store

如果原點可訪問,則從原點 CloudFront 獲取對象並將其返回給查看器。

如果原點無法存取,且最小最大 TTL 值大於 0, CloudFront 將會提供原點之前從原點取得的物件。

為了避免這種行為,請將 Cache-Control: stale-if-error=0 指示詞與從原始伺服器傳回的物件一同包含。如果來源無法訪問,這會導致 CloudFront 返回錯誤以響應 future 的請求,而不是返回它之前從原點獲得的對象。

有關如何使用 CloudFront控制台更改發行版設置的信息,請參閱更新分佈。如需如何使用 CloudFront API 變更發行版設定的相關資訊,請參閱UpdateDistribution

使用 Amazon S3 主控台將標題新增至您的物件

使用 Amazon S3 主控台將 Cache-ControlExpires 標頭欄位新增至 Amazon S3 物件
  1. 登入 AWS Management Console 並開啟 Amazon S3 主控台,網址為 https://console.aws.amazon.com/s3/

  2. 在儲存貯體清單中,選擇包含要新增標頭之檔案的儲存貯體名稱。

  3. 選取要新增標頭的檔案或資料夾名稱旁的核取方塊。當您將標頭新增至資料夾時,它會影響該資料夾內的所有檔案。

  4. 選擇 Actions (動作),然後選擇 Edit metadata (編輯中繼資料)。

  5. Add metadata (新增中繼資料) 面板中,執行下列動作:

    1. 選擇 Add metadata (新增中繼資料)。

    2. 對於 Type (類型),選擇 System defined (已定義系統)。

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

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

  6. 在頁面底部,請選擇 Edit metadata (編輯中繼資料)。