

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

# Amazon S3 原始伺服器之請求和回應行為
<a name="RequestAndResponseBehaviorS3Origin"></a>

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

**Topics**
+ [

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

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

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

瞭解 CloudFront 如何處理檢視器請求和轉送請求至 Amazon S3 原始伺服器。

**Contents**
+ [

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

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

### 條件式 GET 請求
](#RequestS3ConditionalGETs)
+ [

### Cookie
](#RequestS3Cookies)
+ [

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

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

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

### CloudFront 移除或更新的 HTTP 請求標頭
](#request-s3-removed-headers)
+ [

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

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

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

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

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

### 原始伺服器回應逾時
](#RequestS3RequestTimeout)
+ [

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

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

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

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

### 用戶端 IP 位址
<a name="RequestS3IPAddresses"></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`

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

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

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

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

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

Amazon S3 不處理 cookie。如果您設定快取行為將 Cookie 轉送到 Amazon S3 原始伺服器，則 CloudFront 會轉送 Cookie，但 Amazon S3 會忽略這些 Cookie。所有相同物件的未來請求，無論是否變更 Cookie，透過快取中的現有物件提供。

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

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

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

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

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

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

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

如果您想要使用分段上傳的方式，將物件新增至 Amazon S3 儲存貯體，您必須將 CloudFront 原始存取控制 (OAC) 新增至分佈，並將所需要的許可授予該 OAC。如需詳細資訊，請參閱[限制對 Amazon S3 原始伺服器的存取](private-content-restricting-access-to-s3.md)。

**重要**  
如果設定 CloudFront 接受 CloudFront 支援的所有 HTTP 方法並轉送到 Amazon S3，您必須建立一個 CloudFront OAC，以限制對您 Amazon S3 內容的存取，並將所需要的許可權限授予該 OAC。例如若因為想要使用 `PUT` 方法，而設定 CloudFront 接受和轉送這些方法，則您必須設定 Amazon S3 儲存貯體政策，以適當地處理 `DELETE` 請求，讓檢視器無法刪除您不希望其刪除的資源。如需詳細資訊，請參閱[限制對 Amazon S3 原始伺服器的存取](private-content-restricting-access-to-s3.md)。

如需關於 Amazon S3 支援操作的詳細資訊，請參閱 [ Amazon S3 文件](https://docs.aws.amazon.com/s3/index.html)。

### CloudFront 移除或更新的 HTTP 請求標頭
<a name="request-s3-removed-headers"></a>

在將請求轉送到您的 Amazon S3 原始伺服器之前，CloudFront 會先移除或更新一些標頭。對於大多數標頭，這種行為與自訂原始伺服器相同。如需 HTTP 請求標頭的完整清單，以及 CloudFront 處理這些標頭的方式，請參閱 [HTTP 請求標頭和 CloudFront 行為 (自訂和 Amazon S3 原始伺服器)](RequestAndResponseBehaviorCustomOrigin.md#request-custom-headers-behavior)。

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

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

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

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

### OCSP 裝訂
<a name="request-s3-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="RequestS3Protocol"></a>

CloudFront 會根據檢視器請求的通訊協定 (HTTP 或 HTTPS)，轉送 HTTP 或 HTTPS 請求至原始伺服器。

**重要**  
如果設定 Amazon S3 儲存貯體為網站端點，則您無法設定 CloudFront 使用 HTTPS 與原始伺服器進行通訊，因為 Amazon S3 在該組態中不支援 HTTPS 連線。

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

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

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

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

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

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

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

### 原始伺服器回應逾時
<a name="RequestS3RequestTimeout"></a>

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

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

您無法變更 Amazon S3 原始伺服器 (「非」**使用靜態網站託管所設定的 S3 儲存貯體) 的回應逾時。

### 相同物件之同步請求 (請求折疊)
<a name="request-s3-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 不支援請求摺疊。

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

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

**Contents**
+ [

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

### CloudFront 移除或更新的 HTTP 回應標頭
](#response-s3-removed-headers)
+ [

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

### 重新引導
](#ResponseS3Redirects)

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

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

### CloudFront 移除或更新的 HTTP 回應標頭
<a name="response-s3-removed-headers"></a>

在將 Amazon S3 原始伺服器傳來的回應轉送給檢視器之前，CloudFront 會移除或更新下列的標頭欄位：
+ `X-Amz-Id-2`
+ `X-Amz-Request-Id`
+ `Set-Cookie` – 如果設定 CloudFront 轉送 Cookie，此服務會將 `Set-Cookie` 標頭欄位轉送給用戶端。如需詳細資訊，請參閱 [根據 Cookie 快取內容](Cookies.md)。
+ `Trailer`
+ `Transfer-Encoding` – 如果 Amazon S3 原始伺服器傳回此標頭欄位，CloudFront 會將此值設定為 `chunked`，再將回應傳回給檢視器。
+ `Upgrade`
+ `Via` – CloudFront 在對檢視器的回應中將值設為以下值：

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

  值的範例如下所示：

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

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

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

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

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

您可以設定 Amazon S3 儲存貯體，將所有的請求重新引導到另一個主機名稱，這可以是另一個 Amazon S3 儲存貯體或 HTTP 伺服器。如果設定儲存貯體，將所有的請求重新引導，而且如果儲存貯體是 CloudFront 分佈的來源，則我們建議您設定該儲存貯體，使用分佈的網域名稱 (例如，d111111abcdef8.cloudfront.net)，或使用與分佈具有關聯的替代網域名稱 (CNAME) (例如，example.com)，來將所有的請求重新引導到 CloudFront 分佈。否則，檢視器會略過 CloudFront 請求，並從新的原始伺服器直接提供物件。

**注意**  
如果您重新引導請求到備用網域名稱，您必須藉由新增 CNAME 記錄，為您的網域更新 DNS 服務。如需詳細資訊，請參閱 [透過新增備用網域名稱 (CNAME) 使用自訂 URL](CNAMEs.md)。

以下是當您設定儲存貯體重新引導所有請求時，發生的情況：

1. 檢視器 (例如，瀏覽器) 自 CloudFront 請求物件。

1. CloudFront 會將請求轉送到做為您分佈來源的 Amazon S3 儲存貯體。

1. Amazon S3 傳回 HTTP 狀態碼 301 (永久移動) 以及新的位置。

1. CloudFront 快取重新引導狀態碼和新的位置，並傳回值給檢視器。CloudFront 不遵循重新引導，以從新位置取得物件。

1. 檢視器傳送物件的另一個請求，但這次檢視器指定從 CloudFront 取得的新位置：
   + 如果 Amazon S3 儲存貯體使用 CloudFront 分佈的網域名稱或替代網域名稱，來將所有的請求重新引導到分佈，則 CloudFront 會向 Amazon S3 儲存貯體或新位置中的 HTTP 伺服器請求物件。當新的位置傳回物件時，CloudFront 會將其傳回至檢視器並在節點快取。
   + 如果 Amazon S3 儲存貯體將請求重新引導至另一個位置，則第二個請求會略過 CloudFront。Amazon S3 儲存貯體或新位置中的 HTTP 伺服器，會將物件直接傳回給檢視器，因此一律不會在 CloudFront 邊緣快取中快取物件。