

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

# 為自訂原始伺服器之請求和回應行為
<a name="RequestAndResponseBehaviorCustomOrigin"></a>

若要瞭解 CloudFront 如何在您使用自訂原始伺服器時處理請求和回應，請參閱下列章節：

**Topics**
+ [

## CloudFront 如何處理和轉送請求至您的自訂原始伺服器
](#RequestBehaviorCustomOrigin)
+ [

## CloudFront 如何處理來自您的自訂原始伺服器的回應
](#ResponseBehaviorCustomOrigin)

## CloudFront 如何處理和轉送請求至您的自訂原始伺服器
<a name="RequestBehaviorCustomOrigin"></a>

瞭解 CloudFront 如何處理檢視器請求和轉送請求至您的自訂原始伺服器。

**Contents**
+ [

### 身分驗證
](#RequestCustomClientAuth)
+ [

### 快取持續時間和最短 TTL
](#RequestCustomCaching)
+ [

### 用戶端 IP 位址
](#RequestCustomIPAddresses)
+ [

### 用戶端 SSL 身分驗證
](#RequestCustomClientSideSslAuth)
+ [

### 壓縮
](#RequestCustomCompression)
+ [

### 條件式請求
](#RequestCustomConditionalGETs)
+ [

### Cookie
](#RequestCustomCookies)
+ [

### 跨來源資源共享 (CORS)
](#request-custom-cors)
+ [

### 加密
](#RequestCustomEncryption)
+ [

### 包括本文的 GET 請求
](#RequestCustom-get-body)
+ [

### HTTP 方法
](#RequestCustomHTTPMethods)
+ [

### HTTP 請求標頭和 CloudFront 行為 (自訂和 Amazon S3 原始伺服器)
](#request-custom-headers-behavior)
+ [

### HTTP 版本
](#RequestCustomHTTPVersion)
+ [

### 最大請求長度和最大 URL 長度
](#RequestCustomMaxRequestStringLength)
+ [

### OCSP 裝訂
](#request-custom-ocsp-stapling)
+ [

### 持久性連線
](#request-custom-persistent-connections)
+ [

### 通訊協定
](#RequestCustomProtocols)
+ [

### 查詢字串
](#RequestCustomQueryStrings)
+ [

### 原始伺服器連線逾時和嘗試次數
](#custom-origin-timeout-attempts)
+ [

### 原始伺服器回應逾時
](#request-custom-request-timeout)
+ [

### 相同物件之同步請求 (請求折疊)
](#request-custom-traffic-spikes)
+ [

### `User-Agent` 標頭
](#request-custom-user-agent-header)

### 身分驗證
<a name="RequestCustomClientAuth"></a>

如果您將 `Authorization` 標頭轉送至原始伺服器，則可以設定原始伺服器，以針對下列請求類型請求用戶端身分驗證：
+ `DELETE`
+ `GET`
+ `HEAD`
+ `PATCH`
+ `PUT`
+ `POST`

對於 `OPTIONS` 請求，*只有*在您使用下列 CloudFront 設定時才能設定用戶端身分驗證：
+ CloudFront 設定為將 `Authorization` 標頭轉送到您的原始伺服器。
+ CloudFront 設定為*不*快取對 `OPTIONS` 請求的回應。

如需詳細資訊，請參閱[設定 CloudFront 以轉送 `Authorization` 標頭](add-origin-custom-headers.md#add-origin-custom-headers-forward-authorization)。

您可以使用 HTTP 或 HTTPS 將請求轉送至原始伺服器。如需詳細資訊，請參閱[透過 CloudFront 使用 HTTPS](using-https.md)。

### 快取持續時間和最短 TTL
<a name="RequestCustomCaching"></a>

若要控制在 CloudFront 將另一個請求轉送到原始伺服器之前，您的物件留存於 CloudFront 快取中的時間長度，您可以：
+ 設定原始伺服器在每個物件中新增 `Cache-Control` 或 `Expires` 標頭欄位。
+ 指定在 CloudFront 快取行為中最短 TTL 的值。
+ 使用預設值為 24 小時。

如需詳細資訊，請參閱 [管理內容保持在快取中達多久時間 (過期)](Expiration.md)。

### 用戶端 IP 位址
<a name="RequestCustomIPAddresses"></a>

如果檢視器將請求傳送到 CloudFront，而且未包含 `X-Forwarded-For` 請求標頭，則 CloudFront 會從 TCP 連線取得檢視器的 IP 位址、加入包含該 IP 位址的 `X-Forwarded-For` 標頭，然後將該請求轉送給原始伺服器。例如，如果 CloudFront 從 TCP 連線取得 IP 位址 `192.0.2.2`，則會將下列的標頭轉送到原始伺服器：

`X-Forwarded-For: 192.0.2.2`

如果檢視器將請求傳送到 CloudFront，並且包含 `X-Forwarded-For` 請求標頭，則 CloudFront 會從 TCP 連線取得檢視器的 IP 位址、將該 IP 位址附加到 `X-Forwarded-For` 標頭的結尾，然後將該請求轉送給原始伺服器。例如，如果檢視器的請求包含 `X-Forwarded-For: 192.0.2.4,192.0.2.3`，而且 CloudFront 從 TCP 連線取得 IP 位址 `192.0.2.2`，則會將下列的標頭轉送到原始伺服器：

`X-Forwarded-For: 192.0.2.4,192.0.2.3,192.0.2.2`

某些應用程式，例如負載平衡器 (包括 Elastic Load Balancing)、Web 應用程式防火牆、反向代理伺服器、入侵防護系統和 API Gateway，會針對轉送請求的 CloudFront 邊緣伺服器，將該伺服器的 IP 位址附加到 `X-Forwarded-For` 標頭的結尾。例如，如果 CloudFront 在轉送給 ELB 的請求中加入 `X-Forwarded-For: 192.0.2.2`，而且 CloudFront 邊緣伺服器的 IP 位址為 192.0.2.199，則您的 EC2 執行個體所收到的請求，會包含下列的標頭：

`X-Forwarded-For: 192.0.2.2,192.0.2.199`

**注意**  
`X-Forwarded-For` 標頭包含 IPv4 地址 (如 192.0.2.44) 和 IPv6 地址 (如 2001:0db8:85a3::8a2e:0370:7334)。  
另請注意，目前伺服器 (CloudFront) 路徑上的每個節點都可以修改 `X-Forwarded-For` 標頭。如需詳細資訊，請參閱 [RFC 7239‭](https://datatracker.ietf.org/doc/html/rfc7239) 的第 8.1 節。您也可以使用 CloudFront 邊緣運算函數修改標頭。

### 用戶端 SSL 身分驗證
<a name="RequestCustomClientSideSslAuth"></a>

CloudFront 支援交互 TLS (mTLS) 身分驗證，其中用戶端和伺服器都會使用憑證互相驗證。設定 mTLS 後，CloudFront 可以在 TLS 交握期間驗證用戶端憑證，並選擇性地執行 CloudFront Functions 以實作自訂驗證邏輯。

對於未設定 mTLS 時請求用戶端憑證的原始伺服器，CloudFront 會捨棄請求。

如需設定 mTLS 的詳細資訊，請參閱 [關聯 CloudFront 連線函數](connection-functions.md)。

CloudFront 不支援使用用戶端 SSL 憑證之用戶端身分驗證。如果原始伺服器請求用戶端憑證，CloudFront 會放棄請求。

### 壓縮
<a name="RequestCustomCompression"></a>

如需詳細資訊，請參閱 [提供壓縮檔案](ServingCompressedFiles.md)。

### 條件式請求
<a name="RequestCustomConditionalGETs"></a>

如果 CloudFront 收到請求，向邊緣快取要求已過期的物件，會將該請求轉送到原始伺服器，以取得物件的最新版本，或是從原始伺服器取得 CloudFront 邊緣快取已具有最新版本的確認。一般而言，當原始伺服器最後將物件到傳送到 CloudFront 時，會在回應中加入 `ETag` 值、`LastModified` 值，或是這兩個值。在 CloudFront 轉送到原始伺服器的新請求中，CloudFront 會加入下列其中一個或兩個項目：
+ 含有已過期版本物件 `If-Match` 值的 `If-None-Match` 或 `ETag` 標頭。
+ 含有已過期版本物件 `If-Modified-Since` 值的 `LastModified` 標頭。

原始伺服器使用此資訊來判斷物件是否已被更新，且因此是否需傳回整個物件至 CloudFront 或只傳回 HTTP 304 狀態碼 (而非修改)。

**注意**  
若 CloudFront 設為轉送 Cookie (所有或子集)，則不支援 `If-Modified-Since` 和 `If-None-Match` 條件請求。  
如需詳細資訊，請參閱[根據 Cookie 快取內容](Cookies.md)。

### Cookie
<a name="RequestCustomCookies"></a>

您可以設定 CloudFront 轉送 Cookie 至您的原始伺服器。如需詳細資訊，請參閱 [根據 Cookie 快取內容](Cookies.md)。

### 跨來源資源共享 (CORS)
<a name="request-custom-cors"></a>

如果想讓 CloudFront 遵循跨來源資源共享設定，請設定 CloudFront 將 `Origin` 標頭轉送到您的原始伺服器。如需詳細資訊，請參閱 [根據請求標頭快取內容](header-caching.md)。

### 加密
<a name="RequestCustomEncryption"></a>

您可以要求檢視器使用 HTTPS 來將請求傳送至 CloudFront，並要求 CloudFront 使用檢視器所使用的通訊協定，將請求轉送給您的自訂原始伺服器。如需詳細資訊，請參閱下列分佈設定：
+ [檢視器通訊協定政策](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy)
+ [通訊協定 (僅限自訂原始伺服器)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy)

CloudFront 使用 SSLv3、TLSv1.0、TLSv1.1、TLSv1.2 和 TLSv1.3 通訊協定，轉送 HTTPS 請求至原始伺服器。對自訂原始伺服器，您可以選擇您希望 CloudFront 在與原始伺服器通訊時要使用的 SSL 通訊協定：
+ 如果使用 CloudFront 主控台，請透過勾選 **Origin SSL Protocols (原始伺服器 SSL 通訊協定)** 核取方塊，來選擇通訊協定。如需詳細資訊，請參閱 [建立分發](distribution-web-creating-console.md)。
+ 如果使用 CloudFront API，請利用 `OriginSslProtocols` 元素來指定通訊協定。如需詳細資訊，請參閱《Amazon CloudFront API 參考》**中的 [OriginSslProtocols](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_OriginSslProtocols.html) 和 [DistributionConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DistributionConfig.html)。

如果該原始伺服器是 Amazon S3 儲存貯體，則 CloudFront 預設使用 TLSv1.3。

**重要**  
其他 SSL 和 TLS 的版本不支援。

如需有關使用 CloudFront 搭配 HTTPS 的詳細資訊，請參閱[透過 CloudFront 使用 HTTPS](using-https.md)。針對檢視器與 CloudFront 之間，以及 CloudFront 與原始伺服器之間的 HTTPS 通訊，如需 CloudFront 支援密碼的清單，請參閱[檢視器和 CloudFront 之間支援的通訊協定和密碼](secure-connections-supported-viewer-protocols-ciphers.md)。

### 包括本文的 GET 請求
<a name="RequestCustom-get-body"></a>

如果檢視器的 `GET` 請求包含本文，CloudFront 會將 HTTP 狀態碼 403 (禁止) 傳回給檢視器。

### HTTP 方法
<a name="RequestCustomHTTPMethods"></a>

如果設定 CloudFront 處理其支援的所有 HTTP 方法，CloudFront 會接受從檢視器傳來的下列請求，然後將這些請求轉送到您的自訂原始伺服器：
+ `DELETE`
+ `GET`
+ `HEAD`
+ `OPTIONS`
+ `PATCH`
+ `POST`
+ `PUT`

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

如需有關設定您的自訂原始伺服器是否處理這些方法的詳細資訊，請參閱您的原始伺服器的文件。

**重要**  
如果設定 CloudFront 接受 CloudFront 支援的所有 HTTP 方法，並將這些方法轉送到原始伺服器，請設定您的原始伺服器，來處理所有的方法。例如，如果因為想要使用 `POST`，而設定 CloudFront 接受和轉送這些方法，則您必須設定原始伺服器，以適當地處理 `DELETE` 請求，讓檢視器無法刪除您不希望其刪除的資源。如需詳細資訊，請參閱您的 HTTP 伺服器文件。

### HTTP 請求標頭和 CloudFront 行為 (自訂和 Amazon S3 原始伺服器)
<a name="request-custom-headers-behavior"></a>

下表列出可以轉送到自訂和 Amazon S3 原始伺服器的 HTTP 請求標頭 (已指明例外狀況)。對於每個標頭，該表包含下列資訊：
+ 未設定 CloudFront 將標頭轉送到原始伺服器時，CloudFront 的行為，此行為會讓 CloudFront 根據標頭值來快取物件。
+ 您是否可以設定 CloudFront 根據該標頭的標頭值來快取物件。

  您可以設定 CloudFront 根據 `Date` 與 `User-Agent` 標頭中的值來快取物件，但我們不建議這麼做。這些標頭有許多可能的值，且根據其值進行快取可能導致 CloudFront 轉送更多請求到原始伺服器。

如需有關根據標頭值快取的詳細資訊，請參閱[根據請求標頭快取內容](header-caching.md)。


| 標頭 | 未設定 CloudFront 根據標頭值進行快取時的行為 | 支援根據標頭值進行快取 | 
| --- | --- | --- | 
|  其他定義的標頭  |  **舊版快取設定** – CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `Accept`  |  CloudFront 移除標頭。  |  是  | 
|  `Accept-Charset`  |  CloudFront 移除標頭。  |  是  | 
|  `Accept-Encoding`  |  如果該值包含 `gzip` 或 `br`，CloudFront 會將標準化 `Accept-Encoding` 標頭轉送給您的原始伺服器。 如需詳細資訊，請參閱 [壓縮支援](cache-key-understand-cache-policy.md#cache-policy-compressed-objects) 及 [提供壓縮檔案](ServingCompressedFiles.md)。  |  是  | 
|  `Accept-Language`  |  CloudFront 移除標頭。  |  是  | 
|  `Authorization`  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html)  |  是  | 
|  `Cache-Control`  |  CloudFront 轉送標頭至原始伺服器。  |  否  | 
|  `CloudFront-Forwarded-Proto`  |  CloudFront 在轉送請求至您的原始伺服器之前，不會加入標頭。 如需詳細資訊，請參閱 [根據請求的通訊協定設定快取](header-caching.md#header-caching-web-protocol)。  |  是  | 
|  `CloudFront-Is-Desktop-Viewer`  |  CloudFront 在轉送請求至您的原始伺服器之前，不會加入標頭。 如需詳細資訊，請參閱 [根據裝置類型設定快取](header-caching.md#header-caching-web-device)。  |  是  | 
|  `CloudFront-Is-Mobile-Viewer`  |  CloudFront 在轉送請求至您的原始伺服器之前，不會加入標頭。 如需詳細資訊，請參閱 [根據裝置類型設定快取](header-caching.md#header-caching-web-device)。  |  是  | 
|  `CloudFront-Is-Tablet-Viewer`  |  CloudFront 在轉送請求至您的原始伺服器之前，不會加入標頭。 如需詳細資訊，請參閱 [根據裝置類型設定快取](header-caching.md#header-caching-web-device)。  |  是  | 
|  `CloudFront-Viewer-Country`  |  CloudFront 在轉送請求至您的原始伺服器之前，不會加入標頭。  |  是  | 
|  `Connection`  |  CloudFront 在轉送請求至您的原始伺服器之前，以 `Connection: Keep-Alive` 取代此標頭。  |  否  | 
|  `Content-Length`  |  CloudFront 轉送標頭至原始伺服器。  |  否  | 
|  `Content-MD5`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `Content-Type`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `Cookie`  |  如果設定 CloudFront 轉送 Cookie，此服務會將 `Cookie` 標頭欄位轉送給您的原始伺服器。如果未如此設定，CloudFront 會移除 `Cookie` 標頭欄位。如需詳細資訊，請參閱 [根據 Cookie 快取內容](Cookies.md)。  |  否  | 
|  `Date`  |  CloudFront 轉送標頭至原始伺服器。  |  可以，但不建議  | 
|  `Expect`  |  CloudFront 移除標頭。  |  是  | 
|  `From`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `Host`  |  CloudFront 將值設定為與請求的物件相關聯之原始伺服器的網域名稱。 您無法根據 Amazon S3 或 MediaStore 原始伺服器的主機標頭進行快取。  |  是 (自訂) 否 (S3 和 MediaStore)  | 
|  `If-Match`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `If-Modified-Since`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `If-None-Match`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `If-Range`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `If-Unmodified-Since`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `Max-Forwards`  |  CloudFront 轉送標頭至原始伺服器。  |  否  | 
|  `Origin`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `Pragma`  |  CloudFront 轉送標頭至原始伺服器。  |  否  | 
|  `Proxy-Authenticate`  |  CloudFront 移除標頭。  |  否  | 
|  `Proxy-Authorization`  |  CloudFront 移除標頭。  |  否  | 
|  `Proxy-Connection`  |  CloudFront 移除標頭。  |  否  | 
|  `Range`  |  CloudFront 轉送標頭至原始伺服器。如需詳細資訊，請參閱 [CloudFront 如何處理物件的部分請求 (範圍 GET)](RangeGETs.md)。  |  是，根據預設。  | 
|  `Referer`  |  CloudFront 移除標頭。  |  是  | 
|  `Request-Range`  |  CloudFront 轉送標頭至原始伺服器。  |  否  | 
|  `TE`  |  CloudFront 移除標頭。  |  否  | 
|  `Trailer`  |  CloudFront 移除標頭。  |  否  | 
|  `Transfer-Encoding`  |  CloudFront 轉送標頭至原始伺服器。  |  否  | 
|  `Upgrade`  |  除非您已建立 WebSocket 連線，否則 CloudFront 會移除標頭。  |  否 (WebSocket 連線除外)  | 
|  `User-Agent`  |  CloudFront 以 `Amazon CloudFront` 取代此標頭欄位的值。如果您希望 CloudFront 根據使用者所使用的裝置來快取內容，請參閱[根據裝置類型設定快取](header-caching.md#header-caching-web-device)。  |  可以，但不建議  | 
|  `Via`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `Warning`  |  CloudFront 轉送標頭至原始伺服器。  |  是  | 
|  `X-Amz-Cf-Id`  |  CloudFront 在轉送請求至您的原始伺服器之前，將標頭加入檢視器。此標頭值包含可唯一識別請求的加密字串。  |  否  | 
|  `X-Edge-*`  |  CloudFront 會移除所有的 `X-Edge-*` 標頭。  |  否  | 
|  `X-Forwarded-For`  |  CloudFront 轉送標頭至原始伺服器。如需詳細資訊，請參閱 [用戶端 IP 位址](#RequestCustomIPAddresses)。  |  是  | 
|  `X-Forwarded-Proto`  |  CloudFront 移除標頭。  |  否  | 
|  `X-HTTP-Method-Override`  |  CloudFront 移除標頭。  |  是  | 
|  `X-Real-IP`  |  CloudFront 移除標頭。  |  否  | 

### HTTP 版本
<a name="RequestCustomHTTPVersion"></a>

CloudFront 使用 HTTP/1.1 轉送請求到您的自訂原始伺服器。

### 最大請求長度和最大 URL 長度
<a name="RequestCustomMaxRequestStringLength"></a>

請求的長度上限是 32，768 個位元組，包括路徑、查詢字串 （如果有的話） 和標頭。

CloudFront 從請求建構 URL。此 URL 的最大長度為 8192 位元組。

如果 URL 超過長度上限，CloudFront 會將 HTTP 狀態碼 414 (URI 太長） 傳回給檢視器。如果因為超過標頭大小而請求超過長度上限，CloudFront 會將 HTTP 狀態碼 494 傳回給檢視器。在這兩種情況下，CloudFront 會終止與檢視器的 TCP 連線。

### OCSP 裝訂
<a name="request-custom-ocsp-stapling"></a>

當檢視器提交對物件的 HTTPS 請求時，CloudFront 或檢視器都必須向憑證授權單位 (CA) 確認尚未撤銷網域的 SSL 憑證。OCSP 裝訂藉由讓 CloudFront 從 CA 驗證憑證和快取回應加速憑證驗證，所以用戶端不需要直接向 CA 驗證憑證。

當 CloudFront 收到針對同一個網域中物件的大量 HTTPS 請求時，OCSP 裝訂的效能提升會更加明顯。每個在 CloudFront 節點的伺服器必須提交單獨的驗證請求。當 CloudFront 收到針對同一個網域的大量 HTTPS 請求時，在節點中的每個伺服器很快就會收到來自 CA 的回應，伺服器可將此回應「裝釘」到 SSL 交握中的封包；當檢視器確認憑證為有效時，CloudFront 即可提供請求的物件。如果您的分佈無法取得在 CloudFront 節點更多的流量，新的請求更有可能被導向至尚未向 CA 驗證憑證的伺服器。在這種情況下，檢視器會單獨執行驗證步驟，而且 CloudFront 伺服器會提供物件。該 CloudFront 伺服器也會提交驗證請求至 CA，所以下一次收到包含相同網域名稱的請求時，會有來自 CA 的驗證回應。

### 持久性連線
<a name="request-custom-persistent-connections"></a>

當 CloudFront 從您的原始伺服器獲得回應時，會嘗試維持幾秒鐘連線，以確保在該段期間內另一個請求送達。維護持久性連線可節省重新建立 TCP 連線所需的時間，並為後續請求執行另一個 TLS 交握。

如需包括如何設定持續連線時間的詳細資訊，請參閱[保持連線逾時 (僅限自訂與 VPC 原始伺服器)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginKeepaliveTimeout)一節的[所有分佈設定參考](distribution-web-values-specify.md)。

### 通訊協定
<a name="RequestCustomProtocols"></a>

CloudFront 根據下列項目轉送 HTTP 或 HTTPS 請求到原始伺服器：
+ 檢視器傳送請求到 CloudFront 的通訊協定 (HTTP 或 HTTPS)。
+ CloudFront 主控台中 **Origin Protocol Policy** (原始伺服器通訊協定政策) 欄位的值，或者，如果使用 CloudFront API，則為 `OriginProtocolPolicy` 複雜類型中的 `DistributionConfig` 元素。在 CloudFront 主控台中，選項為 **HTTP Only (僅限 HTTP)**、**HTTPS Only (僅限 HTTPS)** 與 **Match Viewer (配合檢視器)**。

如果指定 **HTTP Only (僅限 HTTP)** 或 **HTTPS Only (僅限 HTTPS)**，則無論檢視器請求中的通訊協定為何，CloudFront 都會使用指定的通訊協定，來將請求轉送到原始伺服器。

如果指定 **Match Viewer (配合檢視器)**，CloudFront 會使用檢視器請求中的通訊協定，來將請求轉送到原始伺服器。請注意 CloudFront 僅會在檢視器使用 HTTP 和 HTTPS 通訊協定發出請求時，快取物件一次。

**重要**  
如果 CloudFront 使用 HTTPS 通訊協定來將請求轉送到原始伺服器，而且原始伺服器傳回無效的憑證或自簽憑證，CloudFront 會結束 TCP 連線。

如需有關如何使用 CloudFront 主控台更新分佈的詳細資訊，請參閱[更新分佈](HowToUpdateDistribution.md)。如需有關如何使用 CloudFront API 更新分佈的詳細資訊，請移至《Amazon CloudFront API 參考》**中的 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。

### 查詢字串
<a name="RequestCustomQueryStrings"></a>

您可以設定 CloudFront 是否轉送查詢字串參數至您的原始伺服器。如需詳細資訊，請參閱 [根據查詢字串參數快取內容](QueryStringParameters.md)。

### 原始伺服器連線逾時和嘗試次數
<a name="custom-origin-timeout-attempts"></a>

「原始伺服器連線逾時」**是嘗試建立與原始伺服器連線時 CloudFront 所等待的秒數。

「原始伺服器連線嘗試次數」**是 CloudFront 嘗試連線至原始伺服器的次數。

這些設定共同決定了在容錯移轉至次要原始伺服器 (如果是原始伺服器群組) 或將錯誤回應傳回給檢視器之前，CloudFront 嘗試連線到原始伺服器的時間長度。依預設，CloudFront 會等待 30 秒 (嘗試 3 次，每次 10 秒)，然後再嘗試連線至次要原始伺服器或傳回錯誤回應。您可以指定較短的連線逾時、較少的嘗試次數或兩者，以縮短此時間。

如需詳細資訊，請參閱 [控制原始伺服器逾時和嘗試次數](high_availability_origin_failover.md#controlling-attempts-and-timeouts)。

### 原始伺服器回應逾時
<a name="request-custom-request-timeout"></a>

「原始伺服器回應逾時」**，也稱為「原始伺服器讀取逾時」**或「原始伺服器請求逾時」**，適用於以下兩個數值：
+ 在將請求轉送到原始伺服器之後，CloudFront 等待回應的時間 (以秒為單位)。
+ CloudFront 在收到來自原始伺服器的回應封包後，並在接收下一個封包前所等待的時間 (以秒為單位)。

CloudFront 行為取決於檢視器請求的 HTTP 方法：
+ `GET` 與 `HEAD` 請求 – 如果原始伺服器在回應逾時期間未回應或是停止回應，CloudFront 會結束連線。如果指定的[原始伺服器連線嘗試次數](DownloadDistValuesOrigin.md#origin-connection-attempts)超過 1，CloudFront 會再次嘗試取得完整的回應。CloudFront 最多可嘗試 3 次，由「原始伺服器連線嘗試次數」**設定的值決定。如果原始伺服器在最後一次嘗試時未回應，則 CloudFront 在收到相同原始伺服器上內容的另一個請求之前不會再嘗試。
+ `DELETE`、`OPTIONS`、`PATCH`、`PUT` 及 `POST` 請求 – 如果在讀取逾時期間原始伺服器未回應，CloudFront 將會結束連線，並且不再嘗試聯絡原始伺服器。用戶端可以視需要重新提交請求。

  

如需詳細資訊，包括如何設定原始伺服器回應逾時，請參閱[回應逾時](DownloadDistValuesOrigin.md#DownloadDistValuesOriginResponseTimeout)。

### 相同物件之同步請求 (請求折疊)
<a name="request-custom-traffic-spikes"></a>

如果 CloudFront 邊緣節點收到對物件的請求，而且該物件目前不在快取中或快取物件已過期，CloudFront 會立即將該請求傳送到原始伺服器。不過，如果有對相同物件的同步請求，意即：如果在 CloudFront 接收到第一個請求之前，(具有相同快取金鑰) 其他相同物件的請求抵達邊緣節點，則在將其他請求轉送到原始伺服器之前，CloudFront 將暫停。此短暫的暫停有助於減輕原始伺服器的負載。暫停期間，CloudFront 會將原始伺服器請求的回應傳送至接收到的所有請求。這就是所謂的*請求摺疊*。在 CloudFront 日誌中，會將第一個請求識別為 `x-edge-result-type` 欄位中的 `Miss`，而崩潰的請求會識別為 `Hit`。如需有關 CloudFront 日誌的詳細資訊，請參閱 [CloudFront 和邊緣函數記錄](logging.md)。

CloudFront 只會摺疊共用[*快取金鑰*](understanding-the-cache-key.md)的請求。如果其他的請求沒有共用快取金鑰，(例如，因為您設定 CloudFront 根據請求標頭或查詢字串進行快取)，則 CloudFront 會將所有獨特的請求轉送到原始伺服器。

如果您想要防止所有請求摺疊，可使用受管快取政策 `CachingDisabled` (也可防止快取)。如需詳細資訊，請參閱[使用受管快取政策](using-managed-cache-policies.md)。

若您想防止特定物件的請求折疊，您可以將快取行為的最短 TTL 設為 0 *並*設定原始伺服器傳送 `Cache-Control: private`、`Cache-Control: no-store`、`Cache-Control: no-cache`、`Cache-Control: max-age=0` 或 `Cache-Control: s-maxage=0`。這些組態會增加原始伺服器的負載，並於 CloudFront 等待第一個請求的回應時，為暫停的同步請求引入額外的延遲。

**重要**  
目前如果您在[快取政策](controlling-the-cache-key.md)、[原始伺服器請求政策](controlling-origin-requests.md)或舊版快取設定中啟用 Cookie 轉送，CloudFront 不支援請求摺疊。

### `User-Agent` 標頭
<a name="request-custom-user-agent-header"></a>

如果您希望 CloudFront 根據使用者使用以檢視內容的裝置來快取不同的物件版本，我們建議您設定 CloudFront，以將下列其中一或多個標頭轉送至自訂原始伺服器：
+ `CloudFront-Is-Desktop-Viewer`
+ `CloudFront-Is-Mobile-Viewer`
+ `CloudFront-Is-SmartTV-Viewer`
+ `CloudFront-Is-Tablet-Viewer`

根據 `User-Agent` 標頭值，CloudFront 將這些標頭值設定為 `true` 或 `false`，然後將請求轉送至原始伺服器。如果裝置屬於多個類別，一個以上的值可能是 `true`。例如，針對一些平板電腦裝置，CloudFront 可能將 `CloudFront-Is-Mobile-Viewer` 與 `CloudFront-Is-Tablet-Viewer` 同時設定為 `true`。如需有關如何設定 CloudFront 根據請求標頭進行快取的詳細資訊，請參閱[根據請求標頭快取內容](header-caching.md)。

您可以設定 CloudFront 根據 `User-Agent` 標頭中的值來快取物件，但我們不建議這麼做。`User-Agent` 標頭有許多可能的值，且根據這些值進行快取可能導致 CloudFront 轉送更多請求到原始伺服器。

如果未設定 CloudFront 根據 `User-Agent` 標頭中的值來快取物件，CloudFront 會在轉送請求到您的原始伺服器之前，加入具有下列值的 `User-Agent` 標頭：

`User-Agent = Amazon CloudFront`

無論檢視器所傳來的請求是否包含 `User-Agent` 標頭，CloudFront 都會加入此標頭。如果檢視器所傳來的請求包含 `User-Agent` 標頭，CloudFront 會移除此標頭。

## CloudFront 如何處理來自您的自訂原始伺服器的回應
<a name="ResponseBehaviorCustomOrigin"></a>

瞭解 CloudFront 如何處理來自您的自訂原始伺服器的回應。

**Contents**
+ [

### `100 Continue` 回應
](#Response100Continue)
+ [

### 快取
](#ResponseCustomCaching)
+ [

### 已取消請求
](#response-custom-canceled-requests)
+ [

### 內容議價
](#ResponseCustomContentNegotiation)
+ [

### Cookie
](#ResponseCustomCookies)
+ [

### 捨棄 TCP 連線
](#ResponseCustomDroppedTCPConnections)
+ [

### CloudFront 移除或取代的 HTTP 回應標頭
](#ResponseCustomRemovedHeaders)
+ [

### 可快取檔案大小上限
](#ResponseCustomMaxFileSize)
+ [

### 原始伺服器無法使用
](#ResponseCustomOriginUnavailable)
+ [

### 重新引導
](#ResponseCustomRedirects)
+ [

### `Transfer-Encoding` 標頭
](#ResponseCustomTransferEncoding)

### `100 Continue` 回應
<a name="Response100Continue"></a>

您的原始伺服器無法傳送一個以上的 100-Continue 回應給 CloudFront。在第一個 100-Continue 回應之後，CloudFront 會預期 HTTP 200 OK 回應。如果您的原始伺服器在第一個 100-Continue 回應之後傳送另一個回應，CloudFront 將傳回錯誤。

### 快取
<a name="ResponseCustomCaching"></a>
+ 確保原始伺服器集為有效且為 `Date` 和 `Last-Modified` 標頭欄位準確的值。
+ CloudFront 通常會遵循原始伺服器回應中的 `Cache-Control: no-cache` 標頭。如需例外，請參閱[相同物件之同步請求 (請求折疊)](#request-custom-traffic-spikes)。

### 已取消請求
<a name="response-custom-canceled-requests"></a>

如果物件不在邊緣快取中，而且在 CloudFront 從原始伺服器取得物件之後，但尚未傳送請求的物件之前，檢視器就終止了工作階段 (例如，關閉瀏覽器)，則 CloudFront 不會在節點快取物件。

### 內容議價
<a name="ResponseCustomContentNegotiation"></a>

如果您的原始伺服器在回應中傳回 `Vary:*`，而且對應快取行為的 **Minimum TTL (最短 TTL)** 值為 **0**，則 CloudFront 會快取物件，但仍會將對於該物件的每個後續請求，轉送到原始伺服器，以確認快取包含物件的最新版本。CloudFront 不包含任何條件式標頭，例如 `If-None-Match` 或 `If-Modified-Since`。因此，您的原始伺服器傳回物件至 CloudFront 以回應每個請求。

如果您的原始伺服器在回應中傳回 `Vary:*`，而且對應快取行為的 **Minimum TTL (最短 TTL)** 值是任何其他的值，則 CloudFront 會根據 `Vary`中的說明，來處理 [CloudFront 移除或取代的 HTTP 回應標頭](#ResponseCustomRemovedHeaders) 標頭。

### Cookie
<a name="ResponseCustomCookies"></a>

如果您為快取行為啟用 Cookie，而且如果原始伺服器依物件傳回 Cookie 時，CloudFront 會快取物件和 Cookie。請注意，這可減少物件的快取能力。如需詳細資訊，請參閱 [根據 Cookie 快取內容](Cookies.md)。

### 捨棄 TCP 連線
<a name="ResponseCustomDroppedTCPConnections"></a>

如果在您的原始伺服器將物件傳回 CloudFront 時，CloudFront 與原始伺服器之間的 TCP 連線中斷，則 CloudFront 行為取決於您的原始伺服器是否在回應中包含 `Content-Length` 標頭：
+ **Content-Length 標頭** – CloudFront 會在從您的原始伺服器取得物件時，將物件傳回給檢視器。不過，如果 `Content-Length` 標頭的值不符合物件的大小，CloudFront 不會快取物件。
+ **Transfer-Encoding: Chunked** – CloudFront 會在從您的原始伺服器取得物件時，將物件傳回給檢視器。不過，如果區塊回應不完整，CloudFront 不會快取物件。
+ **沒有 Content-Length 標頭** – CloudFront 會將物件傳回給檢視器並進行快取，但物件可能會不完整。如果沒有 `Content-Length` 標頭，CloudFront 就無法判斷 TCP 連線中斷是意外的或刻意的。

我們建議您設定 HTTP 伺服器加入 `Content-Length` 標頭，來防止 CloudFront 只快取部分物件。

### CloudFront 移除或取代的 HTTP 回應標頭
<a name="ResponseCustomRemovedHeaders"></a>

在將原始伺服器傳來的回應轉送給檢視器之前，CloudFront 會移除或更新下列的標頭欄位：
+ `Set-Cookie` – 如果設定 CloudFront 轉送 Cookie，此服務會將 `Set-Cookie` 標頭欄位轉送給用戶端。如需詳細資訊，請參閱 [根據 Cookie 快取內容](Cookies.md)。
+ `Trailer`
+ `Transfer-Encoding` – 如果原始伺服器傳回此標頭欄位，CloudFront 會將此值設定為 `chunked`，再將回應傳回給檢視器。
+ `Upgrade`
+ `Vary` – 請注意以下各項：
  + 如果設定 CloudFront 將任何裝置特定的標頭，轉送到您的原始伺服器 (`CloudFront-Is-Desktop-Viewer`、`CloudFront-Is-Mobile-Viewer`、`CloudFront-Is-SmartTV-Viewer`、`CloudFront-Is-Tablet-Viewer`)，而且設定原始伺服器將 `Vary:User-Agent` 傳回給 CloudFront，則 CloudFront 會將 `Vary:User-Agent` 傳回給檢視器。如需詳細資訊，請參閱 [根據裝置類型設定快取](header-caching.md#header-caching-web-device)。
  + 如果設定原始伺服器，在 `Accept-Encoding` 標頭中加入 `Cookie` 或 `Vary`，則 CloudFront 會在給檢視器的回應中加入這些值。
  + 如果您設定 CloudFront 將標頭轉送到原始伺服器，並且設定原始伺服器將 `Vary` 標頭中的標頭名稱傳回給 CloudFront (例如，`Vary:Accept-Charset,Accept-Language`)，則 CloudFront 會將 `Vary` 標頭及這些值傳回給瀏覽者。
  + 如需有關 CloudFront 如何處理 `*` 標頭中 `Vary` 值的詳細資訊，請參閱[內容議價](#ResponseCustomContentNegotiation)。
  + 如果設定原始伺服器在 `Vary` 標頭中加入其他任何值，CloudFront 會移除這些值，再將回應傳回給檢視器。
+ `Via` – CloudFront 在對檢視器的回應中將值設為以下值：

  `Via: `*http-版本* *英數-字串*`.cloudfront.net (CloudFront)`

  值的範例如下所示：

  `Via: 1.1 1026589cc7887e7a0dc7827b4example.cloudfront.net (CloudFront)`

### 可快取檔案大小上限
<a name="ResponseCustomMaxFileSize"></a>

CloudFront 在快取中儲存的回應內文大小上限為 50 GB。此包含未指定 `Content-Length` 標頭值的區塊傳輸回應。

使用範圍請求方法來請求每個部分為 50 GB 或更小的多部分物件，即可使用 CloudFront 快取大於此大小的物件。CloudFront 會快取這些部分，因為每個部分皆為 50 GB 或更小。檢視器擷取物件的所有部分之後，就可以重建原始、較大的物件。如需詳細資訊，請參閱 [使用範圍請求快取大物件](RangeGETs.md#cache-large-objects-with-range-requests)。

### 原始伺服器無法使用
<a name="ResponseCustomOriginUnavailable"></a>

如果您的原始伺服器無法使用，而且 CloudFront 收到了請求，要求邊緣快取中已過期的物件 (例如，因為 `Cache-Control max-age` 指令中所指定的期間已過)，則 CloudFront 會提供該物件已過期的版本，或是提供自訂的錯誤頁面。如需有關已設定自訂錯誤頁面時 CloudFront 行為的詳細資訊，請參閱[當您已設定自訂錯誤頁面時，CloudFront 如何處理錯誤](HTTPStatusCodes.md#HTTPStatusCodes-custom-error-pages)。

在某些情況下，很少請求的物件會被移出並在節點快取中不可再用。CloudFront 無法提供已移出的物件。

### 重新引導
<a name="ResponseCustomRedirects"></a>

如果您在原始伺服器中變更物件的位置，您可以設定您的 Web 伺服器重新引導請求至新的位置。在您設定重新引導之後，檢視器第一次提交對物件的請求時，CloudFront 會傳送請求到原始伺服器，而原始伺服器會以重新引導回應 (例如 `302 Moved Temporarily`)。CloudFront 會快取此重新引導並傳回給檢視器。CloudFront 不會遵循重新引導。

您可以設定您的 Web 伺服器重新引導請求以下其中一個位置：
+ 在原始伺服器中物件的新 URL。當檢視器遵循重新引導到新 URL 時，檢視器會略過 CloudFront 並直接至原始伺服器。因此，我們建議您不要重新引導請求到原始伺服器中物件的新 URL。
+ 物件的新 CloudFront URL。如果檢視器提交請求，其中包含新的 CloudFront URL，CloudFront 會從原始伺服器上的新位置取得物件、在節點快取該物件，然後將物件傳回給檢視器。物件的後續請求會被節點提供。這可避免與從原始伺服器檢視器請求的物件有關的延遲和負載。然而，物件的每個新請求將會產生為兩個請求至 CloudFront 的費用。

### `Transfer-Encoding` 標頭
<a name="ResponseCustomTransferEncoding"></a>

CloudFront 只支援 `chunked` 標頭的 `Transfer-Encoding` 值。如果您的原始伺服器傳回 `Transfer-Encoding: chunked`，CloudFront 會在節點收到物件時，將物件傳回到用戶端，並以區塊格式快取物件，來回應後續的請求。

如果檢視器提出 `Range GET` 請求，而原始伺服器傳回 `Transfer-Encoding: chunked`，CloudFront 會將整個物件 (而非請求的範圍) 傳回至檢視器。

如果您無法預定回應內容的長度，我們建議您使用區塊編碼。如需詳細資訊，請參閱 [捨棄 TCP 連線](#ResponseCustomDroppedTCPConnections)。