

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

# CloudFront 如何處理來自原始伺服器的 HTTP 4xx 和 5xx 狀態碼
<a name="HTTPStatusCodes"></a>

當 CloudFront 向您的 Amazon S3 儲存貯體或自訂原始伺服器請求物件時，您的原始伺服器有時會傳回 HTTP 4xx 或 5xx 狀態碼，這表示錯誤已發生。CloudFront 行為取決於：
+ 您是否已設定自訂錯誤頁面
+ 您是否已設定讓 CloudFront 快取原始伺服器錯誤回應的時間長度 (錯誤快取最短 TTL)
+ 狀態碼
+ 對於 5xx 狀態碼，請求的物件目前是否在 CloudFront 邊緣快取
+ 對於某些 4xx 狀態代碼，原始伺服器是否傳回 `Cache-Control max-age` 或 `Cache-Control s-maxage` 標頭

CloudFront 一律會快取 `GET` 與 `HEAD` 請求的回應。您也可以設定 CloudFront 快取 `OPTIONS` 請求的回應。CloudFront 不會快取對使用其他方法之請求的回應。

如果原始伺服器未回應，原始伺服器的 CloudFront 請求則會逾時，而此逾時會被視為是原始伺服器的 HTTP 5xx 錯誤，即使原始伺服器未以該錯誤回應。在這種情況下，CloudFront 會繼續提供快取內容。如需詳細資訊，請參閱 [原始伺服器無法使用](RequestAndResponseBehaviorCustomOrigin.md#ResponseCustomOriginUnavailable)。

如果您已啟用記錄日誌，則不論 HTTP 狀態碼為何，CloudFront 都會將結果寫入日誌。

如需與從 CloudFront 傳回之錯誤訊息相關的詳細功能和選項資訊，請查看以下內容：
+ 如需有關 CloudFront 主控台中自訂錯誤頁面設定的詳細資訊，請參閱[自訂錯誤頁面和錯誤快取](DownloadDistValuesErrorPages.md)。
+ 如需有關 CloudFront 主控台中錯誤快取最短 TTL 的詳細資訊，請參閱[錯誤快取最短 TTL (秒)](DownloadDistValuesErrorPages.md#DownloadDistValuesErrorCachingMinTTL)。
+ 如需 CloudFront 快取的 HTTP 狀態碼清單，請參閱 [CloudFront 快取的 HTTP 4xx 和 5xx 狀態碼](#HTTPStatusCodes-cached-errors)。

**Topics**
+ [

## 當您已設定自訂錯誤頁面時，CloudFront 如何處理錯誤
](#HTTPStatusCodes-custom-error-pages)
+ [

## 您尚未設定自訂錯誤頁面時 CloudFront 如何處理錯誤
](#HTTPStatusCodes-no-custom-error-pages)
+ [

## CloudFront 快取的 HTTP 4xx 和 5xx 狀態碼
](#HTTPStatusCodes-cached-errors)

## 當您已設定自訂錯誤頁面時，CloudFront 如何處理錯誤
<a name="HTTPStatusCodes-custom-error-pages"></a>

如果您已設定自訂錯誤頁面，CloudFront 行為取決於請求的物件是否在邊緣快取中。

### 請求的物件不在邊緣快取中
<a name="HTTPStatusCodes-custom-error-pages-not-in-cache"></a>

CloudFront 會在下列所有情況皆成立時，繼續嘗試從您的原始伺服器取得請求的物件：
+ 一個檢視器請求了一個物件。
+ 該物件未在節點快取中。
+ 您的原始伺服器會傳回 HTTP 4xx 或 5xx 狀態碼，且下列其中一項為真：
  + 您的原始伺服器會傳回 HTTP 5xx 狀態碼，而不傳回 304 狀態碼 (未修改) 或物件的更新版本。
  + 您的原始伺服器會傳回 HTTP 4xx 狀態碼，且不限於快取控制標頭，並包含在以下狀態碼清單中：[CloudFront 快取的 HTTP 4xx 和 5xx 狀態碼](#HTTPStatusCodes-cached-errors)。
  + 您的原始伺服器會傳回包含 `Cache-Control max-age` 標頭或 `Cache-Control s-maxage` 標頭的 HTTP 4xx 狀態碼，且該狀態碼包含在以下狀態碼清單中：控制 [CloudFront 根據 `Cache-Control` 標頭快取的 HTTP 4xx 狀態碼](#HTTPStatusCodes-cached-errors-with-cache-control)。

**CloudFront 會執行下列作業：**

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

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

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

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

1. CloudFront 將自訂錯誤頁面傳回至提出請求的檢視器，並同時快取自訂錯誤頁面達以下最大值：
   + 由錯誤快取最短 TTL (預設為 10 秒) 指定的時間數
   + 當第一個請求產生錯誤時，由原始伺服器傳回，並由 `Cache-Control max-age` 標頭或 `Cache-Control s-maxage` 標頭指定的時間量

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

**注意**  
如果您也為相同的自訂錯誤頁面設定快取行為，CloudFront 會改用快取行為 TTL。在此情況下，CloudFront 會針對步驟 5 和 6 執行下列動作：  
CloudFront 將自訂錯誤頁面傳回給提出請求的檢視器後，CloudFront 會檢查快取行為 TTL (例如您將預設 TTL 設定為 5 秒)。然後 CloudFront 會快取自訂錯誤頁面至該上限。
經過 5 秒後，CloudFront 會再次從原始伺服器擷取自訂錯誤頁面。CloudFront 會根據快取行為 TTL 指定的間隔繼續進行重試。
如需更多詳細資訊，請參閱 [TTL 設定](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMinTTL)中的快取行為。

### 請求的物件在邊緣快取中
<a name="HTTPStatusCodes-custom-error-pages-in-cache"></a>

當下列所有情況皆成立時，CloudFront 會繼續提供目前在邊緣快取中的物件：
+ 一個檢視器請求了一個物件。
+ 物件在節點快取但已過期
+ 您的原始伺服器會傳回 HTTP 5xx 狀態碼，而不傳回 304 狀態碼 (未修改) 或物件的更新版本。

**CloudFront 會執行下列作業：**

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

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

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

## 您尚未設定自訂錯誤頁面時 CloudFront 如何處理錯誤
<a name="HTTPStatusCodes-no-custom-error-pages"></a>

如果您沒有設定自訂錯誤頁面，CloudFront 行為取決於請求的物件是否在邊緣快取中。

**Topics**
+ [

### 請求的物件不在邊緣快取中
](#HTTPStatusCodes-no-custom-error-pages-not-in-cache)
+ [

### 請求的物件在邊緣快取中
](#HTTPStatusCodes-no-custom-error-pages-in-cache)

### 請求的物件不在邊緣快取中
<a name="HTTPStatusCodes-no-custom-error-pages-not-in-cache"></a>

CloudFront 會在下列所有情況皆成立時，繼續嘗試從您的原始伺服器取得請求的物件：
+ 一個檢視器請求了一個物件。
+ 該物件未在節點快取中。
+ 您的原始伺服器會傳回 HTTP 4xx 或 5xx 狀態碼，且下列其中一項為真：
  + 您的原始伺服器會傳回 HTTP 5xx 狀態碼，而不傳回 304 狀態碼 (未修改) 或物件的更新版本。
  + 您的原始伺服器會傳回 HTTP 4xx 狀態碼，且不限於快取控制標頭，並包含在以下狀態碼清單中：[CloudFront 快取的 HTTP 4xx 和 5xx 狀態碼](#HTTPStatusCodes-cached-errors)
  + 您的原始伺服器會傳回包含 `Cache-Control max-age` 標頭或 `Cache-Control s-maxage` 標頭的 HTTP 4xx 狀態碼，且該狀態碼包含在以下狀態碼清單中：控制 [CloudFront 根據 `Cache-Control` 標頭快取的 HTTP 4xx 狀態碼](#HTTPStatusCodes-cached-errors-with-cache-control)。

CloudFront 會執行下列作業：

1. CloudFront 會將 4xx 或 5xx 狀態碼傳回給檢視器，並同時在收到請求的邊緣快取中快取狀態碼達以下最大值：
   + 由錯誤快取最短 TTL (預設為 10 秒) 指定的時間數
   + 當第一個請求產生錯誤時，由原始伺服器傳回，並由 `Cache-Control max-age` 標頭或 `Cache-Control s-maxage` 標頭指定的時間量

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

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

### 請求的物件在邊緣快取中
<a name="HTTPStatusCodes-no-custom-error-pages-in-cache"></a>

當下列所有情況皆成立時，CloudFront 會繼續提供目前在邊緣快取中的物件：
+ 一個檢視器請求了一個物件。
+ 物件在節點快取但已過期 這表示物件已*過時*。
+ 您的原始伺服器會傳回 HTTP 5xx 狀態碼，而不傳回 304 狀態碼 (未修改) 或物件的更新版本。

CloudFront 會執行下列作業：

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

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

1. 在錯誤快取最低 TTL 經過之後，CloudFront 會藉由將另一個請求轉送到您的原始伺服器，再次嘗試取得請求的物件。如果未經常請求物件，CloudFront 可能會在您的原始伺服器仍然傳回 5xx 回應時，將該物件從邊緣快取移出。如需詳細資訊，請參閱[管理內容保持在快取中達多久時間 (過期)](Expiration.md)。

**提示**  
如果您設定 `stale-if-error` 或 `Stale-While-Revalidate` 指令，可以指定過時物件在邊緣快取中可用的時間長度。這可讓您繼續為檢視器提供內容，即使您的原始伺服器無法使用。如需相關資訊，請參閱[提供過時 (過期) 內容](Expiration.md#stale-content)。
CloudFront 只會提供已過時達到指定[最大 TTL](DownloadDistValuesCacheBehavior.md#DownloadDistValuesMaxTTL) 值的物件。在此持續時間之後，物件將無法從邊緣快取使用。

## CloudFront 快取的 HTTP 4xx 和 5xx 狀態碼
<a name="HTTPStatusCodes-cached-errors"></a>

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

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

**注意**  
如果您使用的是 [CachingDisabled](using-managed-cache-policies.md#managed-cache-policy-caching-disabled) 受管快取政策，CloudFront 不會快取這些狀態碼或自訂錯誤頁面。


|  |  | 
| --- |--- |
|  404  |  找不到  | 
|  414  |  URI 請求過大。  | 
|  500  |  內部伺服器錯誤  | 
|  501  |  未導入  | 
|  502  |  無效的閘道  | 
|  503  |  服務無法使用  | 
|  504  |  閘道逾時  | 

### CloudFront 根據 `Cache-Control` 標頭快取的 HTTP 4xx 狀態碼
<a name="HTTPStatusCodes-cached-errors-with-cache-control"></a>

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


|  |  | 
| --- |--- |
|  400  |  錯誤的請求。  | 
|  403  |  禁止  | 
|  405  |  方法不允許  | 
|  412¹  |  先決條件失敗  | 
|  415¹  |  不支援的媒體類型  | 

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