如何 CloudFront 處理和緩存來自您的來源的 HTTP 4xx 和 5xx 狀態碼 - Amazon CloudFront

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

如何 CloudFront 處理和緩存來自您的來源的 HTTP 4xx 和 5xx 狀態碼

從 Amazon S3 儲存貯體或自訂原始伺服器 CloudFront 請求物件時,您的原始伺服器有時會傳回 HTTP 4xx 或 5xx 狀態碼,表示發生錯誤。 CloudFront 行為取決於:

  • 無論您是否已設定自訂錯誤頁面。

  • 您是否已設定要 CloudFront 從來源快取錯誤回應的時間長度 (錯誤快取最低 TTL)。

  • 狀態碼。

  • 對於 5xx 狀態碼,請求的對象當前是否在 CloudFront 邊緣緩存中。

  • 對於某些 4xx 狀態代碼,無論原始伺服器傳回 Cache-Control max-ageCache-Control s-maxage 標頭。

CloudFront 始終緩存響應GETHEAD請求。您也可以設定 CloudFront 為快取要OPTIONS求的回應。 CloudFront 不會快取回應至使用其他方法的要求。

如果來源沒有回應,則對來源的 CloudFront 請求會超時,即使來源沒有回應該錯誤,也會被視為來源的 HTTP 5xx 錯誤。在這種情況下,會 CloudFront 繼續提供快取的內容。如需詳細資訊,請參閱 原始伺服器無法使用

如果您已啟用記錄,則無論 HTTP 狀態碼為何,都會將結果 CloudFront 寫入記錄檔。

如需有關與從傳回之錯誤訊息相關的功能和選項的詳細資訊 CloudFront,請參閱下列內容:

設定自訂錯誤頁面時如何 CloudFront 處理錯誤

如果您已設定自訂錯誤頁面, CloudFront 行為取決於要求的物件是否位於 Edge 快取中。

請求的物件不在邊緣快取中

CloudFront 當以下所有條件都成立時,繼續嘗試從您的來源獲取請求的對象:

  • 一個檢視器請求了一個物件。

  • 該物件未在節點快取中。

  • 您的原始伺服器會傳回 HTTP 4xx 或 5xx 狀態碼,且下列其中一項為真:

CloudFront 執行以下操作:

  1. 在收到檢視器要求的 CloudFront Edge 快取中, CloudFront 檢查您的散發組態,並取得與原始伺服器傳回的狀態碼相對應的自訂錯誤頁面路徑。

  2. CloudFront 尋找發行版中第一個具有與自訂錯誤頁面路徑相符的路徑模式的快取行為。

  3. CloudFront Edge 位置會將自訂錯誤頁面的要求傳送至快取行為中指定的來源。

  4. 原始伺服器傳回自訂錯誤頁面至節點。

  5. CloudFront 會將自訂錯誤頁面傳回給提出要求的檢視器,並快取自訂錯誤頁面,達到下列最大值:

    • 由錯誤快取最短 TTL (預設為 10 秒) 指定的時間數

    • 當第一個請求產生錯誤時,由原始伺服器傳回,並由 Cache-Control max-age 標頭或 Cache-Control s-maxage 標頭指定的時間量

  6. 過了快取時間 (在步驟 5 中決定) 之後,再次 CloudFront 嘗試將另一個要求轉送至您的來源來取得要求的物件。 CloudFront 繼續以錯誤快取最小 TTL 指定的間隔重試。

請求的物件在邊緣快取中

CloudFront 當下列所有條件都成立時,會繼續提供目前在邊緣快取中的物件:

  • 一個檢視器請求了一個物件。

  • 物件在節點快取但已過期

  • 您的原始伺服器會傳回 HTTP 5xx 狀態碼,而不傳回 304 狀態碼 (未修改) 或物件的更新版本。

CloudFront 執行以下操作:

  1. 如果您的來源傳回 5xx 狀態碼,即使物件已過期,仍會 CloudFront 提供該物件。在錯誤快取最小 TTL 的持 CloudFront 續時間內,透過從 Edge 快取提供物件,繼續回應檢視器要求。

    如果您的原始伺服器會傳回一個 4xx 狀態碼, CloudFront 傳回狀態碼給瀏覽者,而不是請求的物件。

  2. 錯誤快取最小 TTL 經過之後,請再次 CloudFront 嘗試將另一個要求轉送至您的來源來取得要求的物件。請注意,如果不經常請求該對象,則 CloudFront 可能會在原始服務器仍在返回 5xx 響應時將其從邊緣緩存中逐出。如需有關物件在 CloudFront Edge 快取中保留多久的資訊,請參閱管理內容保持在快取中達多久時間 (過期)

尚未設定自訂錯誤頁面時如何 CloudFront 處理錯誤

如果您尚未設定自訂錯誤頁面, CloudFront 行為取決於要求的物件是否位於 Edge 快取中。

請求的物件不在邊緣快取中

CloudFront 當以下所有條件都成立時,繼續嘗試從您的來源獲取請求的對象:

  • 一個檢視器請求了一個物件。

  • 該物件未在節點快取中。

  • 您的原始伺服器會傳回 HTTP 4xx 或 5xx 狀態碼,且下列其中一項為真:

CloudFront 執行以下操作:

  1. CloudFront 將 4xx 或 5xx 狀態碼傳回給檢視器,並且還會在收到以下最大請求的邊緣快取中快取中快取狀態碼:

    • 由錯誤快取最短 TTL (預設為 10 秒) 指定的時間數

    • 當第一個請求產生錯誤時,由原始伺服器傳回,並由 Cache-Control max-age 標頭或 Cache-Control s-maxage 標頭指定的時間量

  2. 對於快取時間的持續時間 (在步驟 1 中決定),使用快取的 4xx 或 5xx 狀態碼 CloudFront 回應相同物件的後續檢視器要求。

  3. 過了快取時間 (在步驟 1 中決定) 之後,再次 CloudFront 嘗試將另一個要求轉送至您的來源來取得要求的物件。 CloudFront 繼續以錯誤快取最小 TTL 指定的間隔重試。

請求的物件在邊緣快取中

CloudFront 當下列所有條件都成立時,會繼續提供目前在邊緣快取中的物件:

  • 一個檢視器請求了一個物件。

  • 物件在節點快取但已過期

  • 您的原始伺服器會傳回 HTTP 5xx 狀態碼,而不傳回 304 狀態碼 (未修改) 或物件的更新版本。

CloudFront 執行以下操作:

  1. 如果您的來源傳回 5xx 錯誤碼,即使物件已過期,仍會 CloudFront 提供該物件。在錯誤快取的持續時間下限 TTL (依預設為 10 秒),透過從 Edge 快取提供物件, CloudFront 繼續回應檢視器要求。

    如果您的原始伺服器會傳回一個 4xx 狀態碼, CloudFront 傳回狀態碼給瀏覽者,而不是請求的物件。

  2. 錯誤快取最小 TTL 經過之後,請再次 CloudFront 嘗試將另一個要求轉送至您的來源來取得要求的物件。請注意,如果不經常請求該對象,則 CloudFront 可能會在原始服務器仍在返回 5xx 響應時將其從邊緣緩存中逐出。如需有關物件在 CloudFront Edge 快取中保留多久的資訊,請參閱管理內容保持在快取中達多久時間 (過期)

可快取的狀態碼 CloudFront

CloudFront 根據返回的特定狀態碼以及您的來源是否在響應中返回特定標頭,緩存您的來源返回的 HTTP 4xx 和 5xx 狀態碼。

總是 CloudFront緩存的 HTTP 4xx 和 5xx 狀態碼

CloudFront 始終緩存您的來源返回的以下 HTTP 4xx 和 5xx 狀態碼。如果您已設定 HTTP 狀態碼的自訂錯誤頁面,請 CloudFront 快取自訂錯誤頁面。

404

找不到

414

URI 請求過大。

500

內部伺服器錯誤

501

未導入

502

無效的閘道

503

服務無法使用

504

閘道逾時

根據標頭 CloudFront快取的 HTTP 4xx 狀態碼 Cache-Control

CloudFront 只有在您的來源傳回Cache-Control max-ageCache-Control s-maxage標頭時,才會快取來源傳回的下列 HTTP 4xx 狀態碼。如果您已為其中一個 HTTP 狀態碼設定了自訂錯誤頁面,而您的來源傳回其中一個快取控制標頭,則會CloudFront 快取自訂錯誤頁面。

400

錯誤的請求。

403

禁止

405

方法不允許

412

先決條件失敗

415

不支援的媒體類型