本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
管理內容在快取中停留的時間 (過期)
您可以控制在 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-age
或s-maxage
指示詞將Cache-Control
標頭,或是Expires
標頭欄位新增到檔案。如需詳細資訊,請參閱使用標頭來控制個別物件的快取持續時間。
如需有關 Minimum TTL (最短 TTL)、Default TTL (預設 TTL) 及 Maximum TTL (最長 TTL) 與 max-age
和 s-maxage
命令及 Expires
標頭欄位互動方式的詳細資訊,請參閱 指定 CloudFront 快取物件的時間量。
您也可以控制錯誤 (例如 404 Not Found
) 在 CloudFront 快取中保留多久時間,然後 CloudFront 將再試一次藉由轉送另一個請求至原始伺服器以取得請求的物件。如需詳細資訊,請參閱CloudFront 如何處理來自原始伺服器的 HTTP 4xx 和 5xx 狀態碼。
使用標頭來控制個別物件的快取持續時間
您可以使用 Cache-Control
和 Expires
標頭來控制物件在快取中保持多久的時間。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-age
和Cache-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 快取物件的時間量。
您不能使用 HTTP Cache-Control
或來自檢視者的 Pragma
請求的 GET
標頭欄位,來強制 CloudFront 返回物件的原始伺服器。CloudFront 忽略檢視者請求中的這些標頭欄位。
如需有關 Cache-Control
與 Expires
標頭欄位的詳細資訊,請參閱 RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1 中的以下各節:
-
Section 14.9 Cache Control
(14.9 節快取控制) -
Section 14.21 Expires
(14.21 節過期)
提供過時 (過期) 內容
CloudFront 支援 Stale-While-Revalidate
和 Stale-If-Error
快取控制指令。您可以使用這些指令來指定檢視器可使用過時內容的時間長度。
Stale-While-Revalidate
此指令允許 CloudFront 從快取提供過時的內容,而 CloudFront 則非同步地從原始伺服器擷取新版本。當瀏覽者從節點接收回應時,這可改善延遲,而不必等待背景擷取。新內容會載入背景以供未來請求使用。
範例:Stale-While-Revalidate
當您將 Cache-Control
標頭設定為使用這些指令時,CloudFront 會執行下列動作。
Cache-Control: max-age=3600, stale-while-revalidate=600
-
CloudFront 會將回應快取一小時 (
max-age=3600
)。 -
如果在此持續時間之後提出請求,CloudFront 會提供過時的內容,同時將請求傳送至原始伺服器以重新驗證和重新整理快取的內容。
-
在重新驗證內容時,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
-
CloudFront 快取回應一小時 (
max-age=3600
)。 -
如果原始伺服器在此持續時間後關閉或傳回錯誤,CloudFront 會繼續提供過時的內容長達 24 小時 (
stale-if-error=86400
) -
如果您設定自訂錯誤回應,如果在指定的
stale-if-error
持續時間內發生錯誤,CloudFront 會嘗試提供過時的內容。如果過時的內容無法使用,CloudFront 會提供您為對應錯誤狀態碼設定的自訂錯誤回應。如需詳細資訊,請參閱產生自訂錯誤回應。
備註
-
CloudFront 會將過時的內容提供至
stale-if-error
指令的值或 CloudFront 最大 TTL 的值,以較小者為準。在最長 TTL 持續時間之後,無論stale-if-error
值為何,都不會從節點快取提供過時的物件。 -
如果您未設定
stale-if-error
或自訂錯誤回應,CloudFront 會根據請求的物件是否在節點快取中,傳回過時的物件或將錯誤回應轉送回檢視器。如需詳細資訊,請參閱如果您尚未設定自訂錯誤頁面,CloudFront 如何處理錯誤。
使用這兩個指令
stale-while-revalidate
和 stale-if-error
都是獨立的快取控制指令,您可以一起使用來減少延遲,並為您的原始伺服器新增緩衝區來回應或復原。
範例:使用這兩個指令
當您將 Cache-Control
標頭設定為使用以下指令時,CloudFront 會執行下列動作。
Cache-Control: max-age=3600, stale-while-revalidate=600, stale-if-error=86400
-
CloudFront 快取回應一小時 (
max-age=3600
)。 -
如果在此持續時間之後提出請求,CloudFront 會在重新驗證內容時提供過時的內容長達 10 分鐘 (
stale-while-revalidate=600
)。 -
如果原始伺服器在 CloudFront 嘗試重新驗證內容時傳回錯誤,CloudFront 將繼續提供過時的內容長達 24 小時 (
stale-if-error=86400
)。
快取是效能和更新狀態之間的平衡。使用類似 stale-while-revalidate
與 stale-if-error
指令可增強效能和使用者體驗,但請確保組態與您希望內容的更新狀態保持一致。過時內容指令最適合需要重新整理內容但不需要最新版本的使用案例。此外,如果您的內容沒有變更或很少變更,stale-while-revalidate
可能會新增不必要的網路要求。反之,請考慮設定較長的快取持續時間。
指定 CloudFront 快取物件的時間量
若要控制 CloudFront 在傳送另一個請求至原始伺服器前將物件保留在快取中的時間,您可以:
-
設定 CloudFront 分散式快取行為中的最短、最長和預設 TTL 值。您可以在連接至快取行為的快取政策 (建議使用) 或舊版快取設定中設定這些值。
-
在來自原始伺服器的回應中包含
Cache-Control
或Expires
標頭。這些標頭還有助於判定在傳送另一個請求到 CloudFront 之前,瀏覽器將物件保留在瀏覽器快取中的時間長度。
下表解釋了從原始伺服器傳送的 Cache-Control
和 Expires
標頭如何與快取行為中的 TTL 設定一起運作,以影響快取。
原始標頭 | 最短 TTL = 0 | 最短 TTL > 0 |
---|---|---|
原始伺服器將 |
CloudFront 快取 CloudFront 會針對 瀏覽器快取 瀏覽器會快取 |
CloudFront 快取 CloudFront 快取取決於 CloudFront 最小 TTL 與最大 TTL 及
瀏覽器快取 瀏覽器會快取 |
原始伺服器不會將 |
CloudFront 快取 CloudFront 會快取 CloudFront 預設 TTL 值的物件。 瀏覽器快取 取決於瀏覽器。 |
CloudFront 快取 CloudFront 會針對 CloudFront 最小 TTL 值或預設 TTL 值兩者之中較大的值快取物件。 瀏覽器快取 取決於瀏覽器。 |
原始伺服器將 |
CloudFront 快取 CloudFront 會針對 瀏覽器快取 瀏覽器會快取 |
CloudFront 快取 CloudFront 快取取決於 CloudFront 最小 TTL 與最大 TTL 及
瀏覽器快取 瀏覽器會快取 |
原始伺服器將 |
CloudFront 快取 CloudFront 會快取物件直到 瀏覽器快取 瀏覽器會快取物件直到 |
CloudFront 快取 CloudFront 快取取決於 CloudFront 最短 TTL 與最長 TTL 及
瀏覽器快取 瀏覽器會快取物件直到 |
原始伺服器將 |
CloudFront 和瀏覽器遵守標頭。 |
CloudFront 快取 CloudFront 會快取 CloudFront 最小 TTL 值的物件。請參閱此資料表下方的警告。 瀏覽器快取 瀏覽器遵守標頭。 |
警告
如果您的最小 TTL 大於 0,CloudFront 會使用快取政策的最小 TTL,即使原始標頭中存在 Cache-Control: no-cache
、 no-store
和/或 private
指令。
如果原始伺服器可以存取,CloudFront 會從原始伺服器取得物件並將其傳回給檢視器。
如果無法連線原始伺服器,且最小或最大 TTL 值大於 0,CloudFront 將提供先前從原始伺服器取得的物件。
為了避免這種行為,請將 Cache-Control:
stale-if-error=0
指示詞與從原始伺服器傳回的物件一同包含。如果原始伺服器無法連線,這會導致 CloudFront 傳回錯誤以回應未來的請求,而不是傳回其之前從原始伺服器取得的物件。
如需有關如何使用 CloudFront 主控台變更分佈設定的詳細資訊,請參閱 更新分佈。如需有關如何使用 CloudFront API 為分佈變更設定的詳細資訊,請參閱 UpdateDistribution。
使用 Amazon S3 主控台將標頭新增至物件
您可以將 Cache-Control
或 Expires
標頭欄位新增至 Amazon S3 物件。若要這麼做,請修改物件的中繼資料欄位。
將 Cache-Control
或 Expires
標頭欄位新增至 Amazon S3 物件
-
請遵循《Amazon S3 使用者指南》中 Amazon S3 主控台主題中編輯物件中繼資料之取代系統定義的中繼資料一節中的程序。 Amazon S3
-
對於 Key (金鑰),選擇您要新增的標頭名稱 (Cache-Control (快取控制) 或 Expires (過期))。
-
對於 Value (值),輸入標頭值。例如,對於
Cache-Control
標題,您可以輸入max-age=86400
。對於Expires
,您可以輸入過期日期和時間,例如Wed, 30 Jun 2021 09:28:00 GMT
。 -
請遵循其餘程序來儲存中繼資料變更。