

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

# 管理Lightsail分佈的請求和回應行為
<a name="amazon-lightsail-distribution-request-and-response"></a>

在本指南中，我們會說明在處理和轉送請求至原始伺服器，以及處理來自原始伺服器的回應時，Amazon Lightsail 分發會執行的行為。如需有關分發的詳細資訊，請參閱[內容交付網路分發](amazon-lightsail-content-delivery-network-distributions.md)。

**主題**
+ [分發如何處理和轉送請求至原始伺服器](#distribution-process-and-forward-requests)
+ [分發如何處理來自原始伺服器的回應](#distribution-process-responses)

## 分發如何處理和轉送請求至原始伺服器
<a name="distribution-process-and-forward-requests"></a>

本節包含相關資訊，說明分發如何處理檢視器的請求，以及如何將這些請求轉送至原始伺服器。

**內容**
+ [身分驗證](#RequestCustomClientAuth)
+ [快取持續時間](#RequestCustomCaching)
+ [用戶端 IP 地址](#RequestCustomIPAddresses)
+ [用戶端 SSL 身分驗證](#RequestCustomClientSideSslAuth)
+ [壓縮](#RequestCustomCompression)
+ [條件式請求](#RequestCustomConditionalGETs)
+ [Cookie](#RequestCustomCookies)
+ [跨原始伺服器資源分享 (CORS)](#request-custom-cors)
+ [加密](#RequestCustomEncryption)
+ [包括內文的 GET 請求](#RequestCustom-get-body)
+ [HTTP 方法](#RequestCustomHTTPMethods)
+ [HTTP 請求標頭和分發行為](#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)
+ [使用者代理程式標頭](#request-custom-user-agent-header)

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

針對 `DELETE`、`GET`、`HEAD`、`PATCH`、`POST` 和 `PUT` 請求，如果您設定分發，以將 `Authorization` 標頭轉送至原始伺服器，則您可以設定原始伺服器以請求用戶端身分驗證。

針對 `OPTIONS` 請求，您可以將原始伺服器設定為只在您使用下列分發設定時，才會請求用戶端身分驗證：
+ 將分發設定為將 `Authorization` 標頭轉送至原始伺服器。
+ 將分發設定為不針對 `OPTIONS` 請求的回應進行快取。

您可以將分發設定為使用 HTTP 或 HTTPS 將請求轉送至原始伺服器。

### 快取持續時間
<a name="RequestCustomCaching"></a>

若要控制在分發將另一個請求轉送至原始伺服器之前，您的物件留存於分發快取中的時間長度，您可以：
+ 設定原始伺服器在每個物件中新增 `Cache-Control` 或 `Expires` 標頭欄位。
+ 使用 1 天的快取壽命 (TTL) 預設值。

如需詳細資訊，請參閱[分發進階設定](https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-changing-default-cache-behavior#changing-caching-behavior-distribution-advanced-settings)。

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

如果檢視器將請求傳送至您的分發，且未包含 `X-Forwarded-For` 請求標頭，則分發會從 TCP 連線取得檢視器的 IP 地址，新增包含該 IP 地址的 `X-Forwarded-For` 標頭，然後將該請求轉送至原始伺服器。例如，如果您的分發從 TCP 連線取得 IP 地址 `192.0.2.2`，其會將以下標頭轉送至原始伺服器：

`X-Forwarded-For: 192.0.2.2`

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

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

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

`X-Forwarded-For: 192.0.2.2,192.0.2.199`

**注意**  
`X-Forwarded-For` 標頭包含 IPv4 地址 (如 192.0.2.44) 和 IPv6 地址 (如 2001:0db8:85a3:0000:0000:8a2e:0370:7334)。

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

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

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

Lightsail 分發會轉送具有 `Accept-Encoding` 欄位值 `"identity"` 與 `"gzip"` 的請求。

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

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

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

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

您可以將分發設定為轉送 Cookie 至原始伺服器。如需詳細資訊，請參閱[分發進階設定](https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-changing-default-cache-behavior#changing-caching-behavior-distribution-advanced-settings)。

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

如果您想讓分發遵循跨原始伺服器資源共享設定，請設定您的原始伺服器，以將 `Origin` 標頭轉送至原始伺服器。

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

您可以要求檢視器使用 HTTPS 連接至分發，並要求分發使用 HTTP 或 HTTPS 將請求轉送至原始伺服器。

您的分發會使用 SSLv3、TLSv1.0、TLSv1.1 和 TLSv1.2 通訊協定，將 HTTPS 請求轉送至原始伺服器。其他 SSL 和 TLS 的版本不支援。

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

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

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

如果將您的分發設定為允許所有其支援的 HTTP 方法，您的分發會接受檢視器的下列請求，然後將這些請求轉送至原始伺服器：
+ `DELETE`
+ `GET`
+ `HEAD`
+ `OPTIONS`
+ `PATCH`
+ `POST`
+ `PUT`

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

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

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

### HTTP 請求標頭和分發行為
<a name="request-custom-headers-behavior"></a>

下列清單包含可以轉送至原始伺服器的 HTTP 請求標頭 (已指明例外狀況)。對於每個標頭，該清單包含下列項目的相關資訊：
+ **Supported** (是否支援) - 您是否可以將分發設定為根據該標頭的標頭值快取物件。

  您可以將分發設定為根據 `Date` 與 `User-Agent` 標頭中的值來快取物件，但我們不建議這麼做。這些標頭有許多可能的值，且根據其值來快取會導致分發轉送更多請求至原始伺服器。
+ **Behavior if you not configured** (未設定時的行為) - 未將分發設定為將標頭轉送至原始伺服器時的分發行為，此行為會讓分發根據標頭值來快取物件。
+ **Header** (標頭) - 其他定義的標頭

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Accept`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `Accept-Charset`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `Accept-Encoding`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 若該值包含 `gzip`，您的分發會將 `Accept-Encoding: gzip` 轉送至原始伺服器。如果該值未包含 `gzip`，您的分發會在將請求轉送至原始伺服器之前，移除 `Accept-Encoding` 標頭欄位。
+ **Header** (標頭) - `Accept-Language`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `Authorization`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為)：
  + `GET` 與 `HEAD` 請求 – 您的分發會在將請求轉送至原始伺服器之前，移除 `Authorization` 標頭欄位。
  + `OPTIONS` 請求 – 若設定分發以快取 `OPTIONS` 請求的回應，則分發會在將請求轉送至原始伺服器之前移除 `Authorization` 標頭欄位。

    如果您不將分發設定為快取 OPTIONS 請求的回應，則分發會將 `Authorization` 標頭欄位轉送至原始伺服器。
  + `DELETE`、`PATCH`、`POST` 與 `PUT` 請求 – 您的分發不會在將請求轉送至原始伺服器之前移除標頭欄位。
+ **Header** (標頭) - `Cache-Control`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `CloudFront-Forwarded-Proto`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發在將請求轉送至原始伺服器之前，不會新增標頭。
+ **Header** (標頭) - `CloudFront-Is-Desktop-Viewer`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發在將請求轉送至原始伺服器之前，不會新增標頭。
+ **Header** (標頭) - `CloudFront-Is-Mobile-Viewer`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發在將請求轉送至原始伺服器之前，不會新增標頭。
+ **Header** (標頭) - `CloudFront-Is-Tablet-Viewer`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發在將請求轉送至原始伺服器之前，不會新增標頭。
+ **Header** (標頭) - `CloudFront-Viewer-Country`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發在將請求轉送至原始伺服器之前，不會新增標頭。
+ **Header** (標頭) - `Connection`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會將請求轉送至原始伺服器之前，使用 `Connection: Keep-Alive` 取代此標頭。
+ **Header** (標頭) - `Content-Length`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Content-MD5`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Content-Type`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Cookie`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 如果您將分發設定為轉送 Cookie，則其會將 `Cookie` 標頭欄位轉送至原始伺服器。如果未如此設定，您的分發會移除 `Cookie` 標頭欄位。
+ **Header** (標頭) - `Date`

  **Supported** (是否支援) - 是，但不建議

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Expect`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `From`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Host`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將該值設定為與請求物件相關聯之原始伺服器的網域名稱。
+ **Header** (標頭) - `If-Match`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `If-Modified-Since`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `If-None-Match`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `If-Range`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `If-Unmodified-Since`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Max-Forwards`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Origin`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Pragma`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Proxy-Authenticate`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `Proxy-Authorization`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `Proxy-Connection`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `Range`

  **Supported** (是否支援) - 是，此為預設

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Referer`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `Request-Range`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `TE`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `Trailer`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `Transfer-Encoding`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Upgrade`

  **Supported** (是否支援) - 否 (WebSocket 連線除外)

  **Behavior if not configured** (未設定時的行為) - 除非您已建立 WebSocket 連線，否則您的分發會移除標頭。
+ **Header** (標頭) - `User-Agent`

  **Supported** (是否支援) - 是，但不建議

  **Behavior if not configured** (未設定時的行為) - 您的分發會以 `Amazon CloudFront` 取代此標頭欄位的值。
+ **Header** (標頭) - `Via`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `Warning`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `X-Amz-Cf-Id`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會在將請求轉送至原始伺服器之前，新增標頭至檢視器請求。此標頭值包含可唯一識別請求的加密字串。
+ **Header** (標頭) - `X-Edge-*`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除所有 `X-Edge-*` 標頭。
+ **Header** (標頭) - `X-Forwarded-For`

  **Supported** (是否支援) - 是

  **Behavior if not configured** (未設定時的行為) - 您的分發會將標頭轉送至原始伺服器。
+ **Header** (標頭) - `X-Forwarded-Proto`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。
+ **Header** (標頭) - `X-Real-IP`

  **Supported** (是否支援) - 否

  **Behavior if not configured** (未設定時的行為) - 您的分發會移除標頭。

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

您的分發會使用 HTTP/1.1 將請求轉送至原始伺服器。

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

最大請求長度，包括路徑、查詢字串 (如果有) 和標頭是 20,480 位元組。

您的分發會從請求建構 URL。此 URL 的最大長度為 8192 位元組。

如果請求或 URL 超過這些最大值，您的分發會向檢視器傳回 HTTP 狀態碼 413、Request Entity Too Large (請求實體太大)，然後終止與檢視器的 TCP 連線。

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

在檢視器為物件提交 HTTPS 請求時，您的分發或檢視器必須以憑證授權機構 (CA) 確認網域的 SSL 憑證尚未撤銷。OCSP 裝訂會透過允許您的分發從 CA 驗證憑證和快取回應，加速憑證驗證，讓用戶端不需直接以 CA 驗證憑證。

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

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

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

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

您的分發會根據 Lightsail 主控台中的**原始伺服器通訊協定政策**欄位的值，將 HTTP 或 HTTPS 請求轉送至原始伺服器。在 Lightsail 主控台中，選項為**僅限 HTTP** 以及**僅限 HTTPS**。

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

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

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

您可以設定分發是否將查詢字串參數轉送至原始伺服器。

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

依據預設，您的分發會等待 30 秒 (嘗試 3 次，每次 10 秒)，然後再將錯誤回應傳回給檢視器。



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

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

分發的行為取決於檢視器請求的 HTTP 方法：
+ `GET` 與 `HEAD` 請求 – 如果原始伺服器在回應逾時期間未回應或是停止回應，您的分發會捨棄連線。如果指定的原始伺服器連線嘗試次數超過 1，您的分發會再次嘗試取得完整的回應。您的分發可嘗試最多 3 次，由*原始伺服器連線嘗試次數*設定的值決定。如果原始伺服器在最後一次嘗試時未回應，則您的分發不會再嘗試，直到其收到針對同一原始伺服器上的內容的另一個請求。
+ `DELETE`、`OPTIONS`、`PATCH`、`PUT` 與 `POST` 請求 – 如果原始伺服器未在 30 秒內回應，您的分發會捨棄連線，而且不會再嘗試聯絡原始伺服器。用戶端可以視需要重新提交請求。

### 相同物件之同步請求 (流量高峰)
<a name="request-custom-traffic-spikes"></a>

如果分發節點收到物件請求，而且該物件目前不在快取中或物件已過期，您的分發會立即將該請求傳送到原始伺服器。如果流量突增 (在原始伺服器回應第一個請求之前，如果有對同一個物件的其他請求送達邊緣節點)，則在將對該物件的其他請求轉送到原始伺服器之前，分發會短暫地暫停。一般而言，第一個請求的回應將在後續請求的回應之前抵達分發節點。此暫時暫停有助於減少您的原始伺服器上不必要的負載。如果其他請求不一樣 (例如，因為您將分發設定為根據請求標頭或 Cookie 來進行快取)，則您的分發會將所有獨特的請求轉送至原始伺服器。

### 使用者代理程式標頭
<a name="request-custom-user-agent-header"></a>

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

根據 `User-Agent` 標頭的值，您的分發會將這些標頭的值設定為 `true` 或 `false`，然後將請求轉送至原始伺服器。如果裝置屬於多個類別，一個以上的值可能是 `true`。例如，針對部分平板電腦裝置，您的分發可能會將 `CloudFront-Is-Mobile-Viewer` 與 `CloudFront-Is-Tablet-Viewer` 同時設定為 `true`。

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

如果不將分發設定為根據 `User-Agent` 標頭中的值來快取物件，您的分發會在將請求轉送至原始伺服器之前，新增具有下列值的 `User-Agent` 標頭：

`User-Agent = Amazon CloudFront`

無論檢視器所傳來的請求是否包含 `User-Agent` 標頭，您的分發都會新增此標頭。如果檢視器所傳來的請求包含 `User-Agent` 標頭，您的分發會將其移除。

## 分發如何處理來自原始伺服器的回應
<a name="distribution-process-responses"></a>

本章節包含相關資訊，說明分發如何處理來自原始伺服器的回應。

**內容**
+ [100-Continue 回應](#Response100Continue)
+ [快取](#ResponseCustomCaching)
+ [已取消請求](#response-custom-canceled-requests)
+ [內容議價](#ResponseCustomContentNegotiation)
+ [Cookie](#ResponseCustomCookies)
+ [已捨棄 TCP 連線](#ResponseCustomDroppedTCPConnections)
+ [您的分發移除或取代的 HTTP 回應標頭](#ResponseCustomRemovedHeaders)
+ [檔案大小上限](#ResponseCustomMaxFileSize)
+ [原始伺服器無法使用](#ResponseCustomOriginUnavailable)
+ [重新引導](#ResponseCustomRedirects)
+ [傳輸編碼](#ResponseCustomTransferEncoding)

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

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

### 快取
<a name="ResponseCustomCaching"></a>
+ 請確保您的原始伺服器為 `Date` 和 `Last-Modified` 標頭欄位設定有效且準確的值。
+ 如果從瀏覽者請求包含 `If-Match` 或 `If-None-Match` 請求標頭欄位，設定 `ETag` 回應標頭欄位。如果您未指定 `ETag` 值，則您的分發會忽略後續的 `If-Match` 或 `If-None-Match` 標頭。
+ 您的分發通常會遵循原始伺服器回應中的 `Cache-Control: no-cache` 標頭。如需了解例外情況，請參閱[同時請求相同物件 (流量尖峰)](#request-custom-traffic-spikes)。

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

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

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

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

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

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

如果您為快取行為啟用 Cookie，而且如果原始伺服器隨物件傳回 Cookie，則您的分發會快取物件和 Cookie。請注意，這會降低物件的快取能力。

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

如果在您的原始伺服器將物件傳回分發時，您的分發與原始伺服器之間的 TCP 連線中斷，則分發會根據原始伺服器是否在回應中加入了 `Content-Length` 標頭來執行動作：
+ **Content-Length 標頭** – 您的分發會在從原始伺服器取得物件時，將物件傳回給檢視器。不過，如果 `Content-Length` 標頭的值不符合物件的大小，您的分發就不會快取物件。
+ **Transfer-Encoding: Chunked** – 您的分發會在從原始伺服器取得物件時，將物件傳回給檢視器。不過，如果區塊回應不完整，您的分發不會快取物件。
+ **無 Content-Length 標頭** – 您的分發會將物件傳回給檢視器並快取物件，但物件可能會不完整。如果沒有 `Content-Length` 標頭，您的分發就無法判斷 TCP 連線中斷是意外或刻意造成。

我們建議您設定 HTTP 伺服器以新增 `Content-Length` 標頭，來防止您的分發僅快取部分物件。

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

在將原始伺服器傳來的回應轉送給檢視器之前，您的分發會移除或更新以下標頭欄位：
+ `Set-Cookie` – 如果您設定分發以轉送 Cookie，它會將 `Set-Cookie` 標頭欄位轉送給用戶端。
+ `Trailer`
+ `Transfer-Encoding` – 如果您的原始伺服器傳回此標頭欄位，則您的分發會在將回應傳回給檢視器之前，將值設定為 `chunked`。
+ `Upgrade`
+ `Vary` – 請注意以下各項：
  + 如果您將分發設定為將任何裝置特定的標頭轉送至原始伺服器 (`CloudFront-Is-Desktop-Viewer`、`CloudFront-Is-Mobile-Viewer`、`CloudFront-Is-SmartTV-Viewer`、`CloudFront-Is-Tablet-Viewer`)，且設定原始伺服器以將 `Vary:User-Agent` 傳回給分發，則分發會將 `Vary:User-Agent` 傳回給檢視器。
  + 如果您將原始伺服器設定為在 `Vary` 標頭中加入 `Accept-Encoding` 或 `Cookie`，則您的分發會在對檢視器的回應中加入這些值。
  + 如果您設定分佈將允許標頭清單轉送至原始伺服器，而且如果您設定原始伺服器將標頭名稱傳回至`Vary`標頭中的分佈 （例如，`Vary:Accept-Charset,Accept-Language`)，則您的分佈會將包含這些值的`Vary`標頭傳回給檢視器。
  + 如需有關分發如何處理 `Vary` 標頭中的 `*` 值的詳細資訊，請參閱[內容議價](#ResponseCustomContentNegotiation)。
  + 如果您將原始伺服器設定為在 `Vary` 標頭中加入其他任何值，您的分發會在把回應傳回給檢視器之前，移除這些值。
+ `Via` – 您的分發會在對檢視器的回應中將該值設定為以下值：

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

  例如，如果用戶端透過 HTTP/1.1 發出請求，則值將類似以下內容：

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

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

您的分發將傳回給檢視器之回應內文的大小上限為 20 GB。此包含未指定 `Content-Length` 標頭值的區塊傳輸回應。

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

如果您的原始伺服器無法使用，且您的分發已收到請求，要求取得邊緣快取中已經過期的物件 (例如，因為 `Cache-Control max-age` 指令中所指定的期間已過)，則分發會提供該物件已過期的版本，或是提供自訂的錯誤頁面。

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

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

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

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

### 傳輸編碼
<a name="ResponseCustomTransferEncoding"></a>

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

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

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