

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

# 產生自訂錯誤回應
<a name="GeneratingCustomErrorResponses"></a>

如果透過 CloudFront 提供的物件出於某些原因無法使用，則 Web 伺服器通常會傳回相關的 HTTP 狀態碼到 CloudFront，以指明此情形。例如若檢視器請求無效的 URL，則 Web 伺服器會傳回 HTTP 404 (找不到) 狀態碼到 CloudFront，然後 CloudFront 會傳回該狀態碼給檢視器。您可以建立 CloudFront 傳回給檢視器的自訂錯誤回應，而不是使用此預設錯誤回應。

如果您設定 CloudFront 傳回 HTTP 狀態碼的自訂錯誤頁面，但自訂錯誤頁面不可用，則 CloudFront 傳回 CloudFront 從包含自訂錯誤頁面的原始伺服器接收到的狀態碼給檢視器。例如，假設您的自訂原始伺服器會傳回一個 500 狀態碼且您已配置 CloudFront 以從 Amazon S3 儲存貯體取得 500 狀態碼的自訂錯誤頁面。不過有人不小心從 Amazon S3 儲存貯體刪除了自訂錯誤頁面。CloudFront 會傳回 HTTP 404 狀態碼 (找不到) 到請求物件的檢視器。

當 CloudFront 傳回自訂錯誤頁面給檢視器時，您支付自訂錯誤頁面的標準 CloudFront 費用，而非請求的物件費用。如需 CloudFront 費用的詳細資訊，請參閱 [Amazon CloudFront 定價](https://aws.amazon.com/cloudfront/pricing/)。

**Topics**
+ [設定錯誤回應行為](custom-error-pages-procedure.md)
+ [針對特定的 HTTP 狀態碼建立自訂錯誤頁面](creating-custom-error-pages.md)
+ [將物件和自訂錯誤頁面存放在不同位置](custom-error-pages-different-locations.md)
+ [變更 CloudFront 傳回的回應碼](custom-error-pages-response-code.md)
+ [控制 CloudFront 快取錯誤的時間長度](custom-error-pages-expiration.md)

# 設定錯誤回應行為
<a name="custom-error-pages-procedure"></a>

您可透過幾種選項來管理 CloudFront 在發生錯誤時的回應方式。若要設定自訂錯誤回應，您可以使用 CloudFront 主控台、CloudFront API 或 CloudFormation。無論您選擇如何更新組態，請考慮下列提示和建議：
+ 在 CloudFront 可存取的位置中儲存自訂錯誤頁面。我們建議您將它們存放在 Amazon S3 儲存貯體中，並且[不要將它們儲存在與網站或應用程式內容之其餘部分相同的位置](custom-error-pages-different-locations.md)。如果您將自訂錯誤頁面儲存在與您的網站或應用程式相同的原始伺服器，且原始伺服器開始傳回 5xx 錯誤，則 CloudFront 無法取得自訂錯誤頁面，因為原始伺服器無法使用。如需詳細資訊，請參閱 [將物件和自訂錯誤頁面存放在不同位置](custom-error-pages-different-locations.md)。
+ 請確定 CloudFront 具有取得自訂錯誤頁面的許可。如果自訂錯誤頁面存放於 Amazon S3 中，頁面必須可以公開存取，或者您必須設定 CloudFront [原始存取控制 (OAC)](private-content-restricting-access-to-s3.md)。如果自訂錯誤頁面存放在自訂原始伺服器中，則必須可以公開存取頁面。
+ (選用) 如果需要，請設定您的原始伺服器以新增 `Cache-Control` 或 `Expires` 標頭以及自訂錯誤頁面。您也可以使用 **Error Caching Minimum TTL** (快取最小 TTL 時發生錯誤) 設定來控制 CloudFront 快取自訂錯誤頁面的時間長度。如需詳細資訊，請參閱[控制 CloudFront 快取錯誤的時間長度](custom-error-pages-expiration.md)。

## 設定自訂錯誤回應
<a name="custom-error-pages-console"></a>

若要在 CloudFront 主控台中設定自訂錯誤回應，您必須擁有 CloudFront 分發。在主控台中，自訂錯誤回應的組態設定僅適用於現有分發。若要了解如何建立分發，請參閱[開始使用 CloudFront 標準分佈](GettingStarted.SimpleDistribution.md)。

------
#### [ Console ]

**若要設定自訂錯誤回應 (主控台)**

1. 登入 AWS 管理主控台 ，並在位於 的 CloudFront 主控台中開啟**分佈**頁面[https://console.aws.amazon.com/cloudfront/v4/home#distributions](https://console.aws.amazon.com/cloudfront/v4/home#distributions)。

1. 在分發清單中，選擇要更新的分發。

1. 選擇 **Error Pages** (錯誤頁面) 標籤，然後選擇 **Create Custom Error Response** (建立自訂錯誤回應)。

1. 輸入適用的值。如需詳細資訊，請參閱[自訂錯誤頁面和錯誤快取](DownloadDistValuesErrorPages.md)。

1. 輸入所需的值後，選擇 **Create** (建立)。

------
#### [ CloudFront API or CloudFormation ]

若要使用 CloudFront API 或 設定自訂錯誤回應 CloudFormation，請在分佈中使用 `CustomErrorResponse`類型。如需詳細資訊，請參閱下列內容：
+ *AWS CloudFormation 使用者指南*中的 [AWS::CloudFront::Distribution CustomErrorResponse](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-customerrorresponse.html)
+ *《Amazon CloudFront API 參考》*中的 [CustomErrorResponse](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CustomErrorResponse.html)

------

# 針對特定的 HTTP 狀態碼建立自訂錯誤頁面
<a name="creating-custom-error-pages"></a>

若您想要顯示自訂錯誤訊息而非預設訊息，比方與您的網站其餘部分使用相同格式設定的頁面，則可以讓 CloudFront 向檢視器傳回包含自訂錯誤訊息的物件 (如 HTML 檔案)。

若要指定您想要傳回的檔案，以及指明檔案應該傳回的錯誤，您可以更新 CloudFront 分發以指定這些值。如需詳細資訊，請參閱 [設定錯誤回應行為](custom-error-pages-procedure.md)。

例如，以下是自訂錯誤頁面：

![\[custom AWS 404 頁面範例的螢幕擷取畫面。\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/images/custom-error-page-aws-404-example.png)


您可以為每個支援的 HTTP 狀態碼指定不同的物件，或您可以為所有支援的狀態碼使用相同的物件。您可以選擇為某些狀態碼指定自訂錯誤頁面，而不是為其他狀態碼指定。

由於各種原因，透過 CloudFront 提供的物件無法使用。這些分為兩大類：
+ *用戶端錯誤*顯示請求有問題。例如，有指定名稱的物件不可用，或使用者沒有在 Amazon S3 儲存貯體中取得物件所需的許可。當用戶端發生錯誤，原始伺服器會在 4xx 範圍中傳回 HTTP 狀態碼給 CloudFront。
+ *伺服器錯誤*顯示原始伺服器有問題。例如，HTTP 伺服器是忙碌或不可用。當伺服器發生錯誤，您的原始伺服器會在 5xx 範圍中傳回 HTTP 狀態碼至 CloudFront，或特定期間內 CloudFront 不從您的原始伺服器取得回應並假設一個 504 狀態碼 (閘道逾時)。

針對 HTTP 狀態碼，CloudFront 可以傳回自訂錯誤頁面，其中包含下列項目：
+ 400, 403, 404, 405, 414, 416
+ 500、501、502、503、504
**備註**  
如果 CloudFront 偵測到請求可能不安全，CloudFront 會傳回 400 (錯誤請求) 錯誤，而不是自訂錯誤頁面。
您可以建立自訂錯誤頁面以取得 HTTP 狀態碼 416 (不滿足請求範圍)，當原始伺服器傳回狀態碼 416 給 CloudFront 時，您可以變更 CloudFront 傳回給檢視器的 HTTP 狀態碼 如需詳細資訊，請參閱[變更 CloudFront 傳回的回應碼](custom-error-pages-response-code.md)。然而，CloudFront 不會快取狀態碼 416 回應，因此，即使您為狀態碼 416 指定 **Error Caching Minimum TTL** (快取最小 TTL 時發生錯誤) 的值，CloudFront 也不會使用它。
在某些情況下，CloudFront 不會傳回 HTTP 503 狀態碼的自訂錯誤頁面，即使您將 CloudFront 設定為此。如果 CloudFront 錯誤碼為 `Capacity Exceeded` 或 `Limit Exceeded`，則 CloudFront 會將 503 狀態碼傳回給檢視器，而不使用您的自訂錯誤頁面。
如果您建立了自訂錯誤頁面，CloudFront 將針對下列回應代碼傳回 `Connection: close` 或 `Connection: keep-alive`：  
CloudFront 會對以下狀態碼傳回 `Connection: close`：400、405、414、416、500、501
CloudFront 會對以下狀態碼傳回 `Connection: keep-alive`：403、404、502、503、504

如需 CloudFront 如何從原始伺服器處理錯誤回應的詳細說明，請參閱 [CloudFront 如何處理來自原始伺服器的 HTTP 4xx 和 5xx 狀態碼](HTTPStatusCodes.md)。

# 將物件和自訂錯誤頁面存放在不同位置
<a name="custom-error-pages-different-locations"></a>

如果您要在不同位置存放物件和自訂錯誤頁面，則您的分佈必須包含下列為屬實的快取行為：
+ **Path Pattern (路徑模式)** 的值與自訂錯誤訊息的路徑相符。例如，假設您已在 Amazon S3 儲存貯體名為 `/4xx-errors` 的目錄中儲存了 4xx 錯誤的自訂錯誤頁面。您的分佈必須包含路徑模式路由自訂錯誤頁面請求至該位置的快取行為，例如 `/4xx-errors/*`。
+ **Origin (原始伺服器)** 的數值將 **Origin ID (原始伺服器 ID)** 的數值指定給包含自訂錯誤頁面的原始伺服器。

如需詳細資訊，請參閱[快取行為設定](DownloadDistValuesCacheBehavior.md)。

# 變更 CloudFront 傳回的回應碼
<a name="custom-error-pages-response-code"></a>

您可以將 CloudFront 設定為傳回不同 HTTP 狀態碼給檢視器，而非 CloudFront 從原始伺服器接收的狀態碼。例如，如果您的原始伺服器傳回 500 狀態碼到 CloudFront，您可能會希望 CloudFront 傳回自訂錯誤頁面和 200 狀態碼 (OK) 給檢視器。基於各種原因，您想要讓 CloudFront 傳回狀態碼到檢視器，該檢視器與原始伺服器傳回到 CloudFront 的檢視器不同：
+ 有些網際網路裝置 (例如，一些防火牆和公司代理) 會攔截 HTTP 4xx 和 5xx 狀態碼並禁止回應傳回給檢視器。在此案例中，如果您替換 `200`，回應不會攔截。
+ 如果您不在意區別不同的用戶端錯誤或伺服器錯誤，您可以指定 `400` 或 `500` 作為 CloudFront 為所有 4xx 或 5xx 狀態碼傳回的值。
+ 您會希望傳回 `200` 狀態碼 (OK) 與靜態網站，如此您的客戶便不會知道您網站已關閉。

如果您啟用 [CloudFront 標準日誌](AccessLogs.md)並設定 CloudFront 來變更回應中的 HTTP 狀態碼，則日誌中的 `sc-status` 欄位值會包含您指定的狀態碼。不過，`x-edge-result-type` 資料行的值不會受到影響。它包含來自原始伺服器回應的結果類型。例如，當原始伺服器傳回 `200` (找不到) 給 CloudFront 時，假設您配置 CloudFront 傳回 `404` 的狀態碼給檢視器。當原始伺服器回應 `404` 狀態碼的請求時，在日誌中 `sc-status` 資料行的值會是 `200`，但 `x-edge-result-type` 資料行的值則會是 `Error`。

您可以配置 CloudFront 傳回下列任何 HTTP 狀態碼以及自訂錯誤頁面：
+ 200
+ 400, 403, 404, 405, 414, 416
+ 500、501、502、503、504

# 控制 CloudFront 快取錯誤的時間長度
<a name="custom-error-pages-expiration"></a>

根據預設，CloudFront 會每 10 秒快取錯誤回應。CloudFront 然後將物件的下一個請求提交給您的原始伺服器，以查看導致錯誤的問題是否已解決，並且請求的物件是否可使用。

您可以指定錯誤快取持續時間 **錯誤快取最短 TTL** 給每個 CloudFront 快取的 4xx 和 5xx 狀態碼。(如需詳細資訊，請參閱 [CloudFront 快取的 HTTP 4xx 和 5xx 狀態碼](HTTPStatusCodes.md#HTTPStatusCodes-cached-errors)。) 當您指定持續時間時，請注意以下事項：
+ 如果您指定的錯誤快取持續時間不長，則 CloudFront 轉送到原始伺服器的請求，會比如果您指定較長的持續時間時來的多。針對 5xx 錯誤，這可能會讓原本導致原始伺服器傳回錯誤的問題加劇。
+ 當您的原始伺服器傳回物件的錯誤時，CloudFront 使用錯誤回應或自訂錯誤頁面來回應物件的請求，直到錯誤快取持續時間過後。如果您指定很長的錯誤快取持續時間，則 CloudFront 可能需要很長的時間使用錯誤回應或自訂錯誤頁面來持續回應請求，到物件再次可用之後。

**注意**  
您可以建立自訂錯誤頁面以取得 HTTP 狀態碼 416 (不滿足請求範圍)，當原始伺服器傳回狀態碼 416 給 CloudFront 時，您可以變更 CloudFront 傳回給檢視器的 HTTP 狀態碼 (如需詳細資訊，請參閱「[變更 CloudFront 傳回的回應碼](custom-error-pages-response-code.md)」。) 然而，CloudFront 不會快取狀態碼 416 回應，因此，即使您為狀態碼 416 指定 **Error Caching Minimum TTL** (快取最小 TTL 時發生錯誤) 的值，CloudFront 也不會使用它。

如果您想要控制 CloudFront 快取個別物件錯誤的時間長度，您可以配置原始伺服器新增適用的標頭給該物件的錯誤回應。

如果原始伺服器新增 `Cache-Control: max-age` 或 `Cache-Control: s-maxage` 指示詞，或 `Expires` 標頭：CloudFront 將快取在標頭或 **Error Caching Minimum TTL** (錯誤快取最短 TTL) 中較大值的錯誤回應。

**注意**  
`Cache-Control: max-age` 和 `Cache-Control: s-maxage` 值不得大於為擷取的錯誤頁面所設定之快取行為的 **Maximum TTL** (最大 TTL) 值。

如果原始伺服器新增錯誤代碼 404`Cache-Control: no-store``Cache-Control: no-cache`、410、414 或 501 的 、 或 `Cache-Control: private`指令，CloudFront 不會快取錯誤回應。對於所有其他錯誤代碼，CloudFront 會忽略 `no-store`、 和 `private`指令`no-cache`，並快取錯誤**快取最低 TTL 值的錯誤**回應。

如果原始伺服器新增其他 `Cache-Control` 指示詞或未新增標頭：CloudFront 將快取**Error Caching Minimum TTL** (錯誤快取最短 TTL )值的錯誤回應。

如果物件的 4xx 或 5xx 狀態碼的到期時間超過您想要的時間，且物件可以再次使用，則您可以使用請求的物件 URL 使快取的錯誤碼失效。如果原始伺服器傳回多個物件的錯誤回應，則您需要個別使每一個物件失效。如需有關使物件失效的詳細資訊，請參閱[使檔案失效以移除內容](Invalidation.md)。

如果您已為 S3 儲存貯體原始伺服器啟用快取，且您在 CloudFront 分佈中設定錯誤快取最短 TTL 為 0 秒，則在發生 S3 原始伺服器錯誤的情況下，您仍會看到錯誤快取最短 TTL 為 1 秒。CloudFront 會這麼做是為了保護原始伺服器免受 DDoS 攻擊。這不適用於其他類型的原始伺服器。