CloudFront 如何處理來自原始伺服器的 HTTP 4xx 和 5xx 狀態碼 - Amazon CloudFront

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

CloudFront 如何處理來自原始伺服器的 HTTP 4xx 和 5xx 狀態碼

當 CloudFront 向您的 Amazon S3 儲存貯體或自訂原始伺服器請求物件時,您的原始伺服器有時會傳回 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 行為取決於請求的物件是否在邊緣快取中。

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

CloudFront 會在下列所有情況皆成立時,繼續嘗試從您的原始伺服器取得請求的物件:

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

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

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

CloudFront 會執行下列作業:
  1. 在收到檢視器請求的 CloudFront 邊緣快取中,CloudFront 會檢查您的分佈設定,並取得自訂錯誤頁面的路徑,此頁面對應於原始伺服器所傳回的狀態碼。

  2. CloudFront 在有相符自訂錯誤頁面路徑的路徑模式之分佈中找到第一個快取行為。

  3. CloudFront 節點將自訂錯誤頁面的請求傳送到快取行為中指定的原始伺服器。

  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 會藉由從邊緣快取提供物件來繼續回應檢視器的請求。

    如果您的原始伺服器傳回 4xx 狀態碼,CloudFront 會將狀態碼 (而非請求的物件) 傳回給檢視器。

  2. 在錯誤快取最低 TTL 經過之後,CloudFront 會藉由將另一個請求轉送到您的原始伺服器,再次嘗試取得請求的物件。請注意,如果未經常請求物件,CloudFront 可能會在您的原始伺服器仍然傳回 5xx 回應時,將該物件從邊緣快取移出。如需有關物件在 CloudFront 邊緣快取中留存時間長度的詳細資訊,請參閱管理內容在快取中停留的時間 (過期)

如果您尚未設定自訂錯誤頁面,CloudFront 如何處理錯誤

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

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

CloudFront 會在下列所有情況皆成立時,繼續嘗試從您的原始伺服器取得請求的物件:

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

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

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

CloudFront 會執行下列作業:

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

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

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

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

  3. 在快取時間 (於步驟 1 中決定) 經過之後,CloudFront 會藉由將另一個請求轉送到您的原始伺服器,再次嘗試取得請求的物件。CloudFront 會根據錯誤快取最短 TTL 指定的間隔,繼續進行重試。

請求的物件在邊緣快取中

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

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

  • 物件在節點快取但已過期 這表示物件已過時

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

CloudFront 會執行下列作業:

  1. 如果您的原始伺服器傳回 5xx 錯誤碼,即使物件已過期,CloudFront 仍會提供物件。在錯誤快取最短 TTL (預設 10 秒) 期間,CloudFront 會藉由從邊緣快取提供物件來繼續回應檢視器的請求。

    如果您的原始伺服器傳回 4xx 狀態碼,CloudFront 會將狀態碼 (而非請求的物件) 傳回給檢視器。

  2. 在錯誤快取最低 TTL 經過之後,CloudFront 會藉由將另一個請求轉送到您的原始伺服器,再次嘗試取得請求的物件。如果不經常請求物件,CloudFront 可能會在原始伺服器仍傳回 5xx 回應時從節點快取中將其移出。如需詳細資訊,請參閱管理內容在快取中停留的時間 (過期)

提示
  • 如果您設定 stale-if-errorStale-While-Revalidate指令,您可以指定在節點快取中過時的物件可用時間。這可讓您繼續為瀏覽者提供內容,即使您的原始伺服器無法使用。如需相關資訊,請參閱 提供過時 (過期) 內容

  • CloudFront 只會提供已過時至指定最大 TTL 值的物件。在此持續時間之後,物件將無法從節點快取使用。

CloudFront 快取的 HTTP 4xx 和 5xx 狀態碼

視傳回的特定狀態碼,以及您的原始伺服器是否在回應中傳回特定標頭而定,CloudFront 會快取您的原始伺服器所傳回的 HTTP 4xx 和 5xx 狀態碼。

CloudFront 會快取您的原始伺服器傳回的下列 HTTP 4xx 和 5xx 狀態碼。如果您已為 HTTP 狀態碼設定自訂錯誤頁面,CloudFront 會快取自訂錯誤頁面。

注意

如果您使用的是 CachingDisabled受管快取政策,CloudFront 不會快取這些狀態碼或自訂錯誤頁面。

404

找不到

414

URI 請求過大。

500

內部伺服器錯誤

501

未導入

502

無效的閘道

503

服務無法使用

504

閘道逾時

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

如果您的原始伺服器傳回 Cache-Control max-ageCache-Control s-maxage 標頭,則 CloudFront 只會快取您原始伺服器所傳回的下列 HTTP 4xx 狀態碼。如果您已為其中一個 HTTP 狀態碼設定自訂錯誤頁面,且原始伺服器傳回其中一個快取控制標頭,則 CloudFront 會快取自訂錯誤頁面。

400

錯誤的請求。

403

禁止

405

方法不允許

4121

先決條件失敗

4151

不支援的媒體類型

1CloudFront 不支援為這些 HTTP 狀態碼建立自訂錯誤頁面。