Amazon S3 原始伺服器之請求和回應行為 - Amazon CloudFront

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

Amazon S3 原始伺服器之請求和回應行為

若要了解當您使用 Amazon S3 做為原始伺服器時CloudFront 如何處理請求和回應,請參閱下列各節:

CloudFront 如何處理和轉送請求至您的 Amazon S3 原始伺服器

了解 CloudFront 如何處理檢視器請求,並將請求轉送到您的 Amazon S3 原始伺服器。

快取持續時間和最短 TTL

若要控制在 CloudFront 將另一個請求轉送到原始伺服器之前,您的物件留存於 CloudFront 快取中的時間長度,您可以:

  • 設定原始伺服器在每個物件中新增 Cache-ControlExpires 標頭欄位。

  • 指定在 CloudFront 快取行為中最短 TTL 的值。

  • 使用預設值為 24 小時。

如需詳細資訊,請參閱 管理內容在快取中停留的時間 (過期)

用戶端 IP 地址

如果檢視器將請求傳送至 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 請求

當 CloudFront 收到從節點快取過期之物件的請求時,會將請求轉送至 Amazon S3 原始伺服器,以取得物件的最新版本,或從 Amazon S3 取得 CloudFront 節點快取已具有最新版本的確認。當 Amazon S3 最初將物件傳送到 CloudFront 時,在回應中加入了 ETag 值和 LastModified 值。在 CloudFront 轉送至 Amazon S3 的新請求中,CloudFront 新增下列其中一個或兩個標頭:

  • 含有已過期版本物件 If-Match 值的 If-None-MatchETag 標頭。

  • 含有已過期版本物件 If-Modified-Since 值的 LastModified 標頭。

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

Cookie

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

跨來源資源共享 (CORS)

如果想讓 CloudFront 遵循 Amazon S3 跨來源資源共享設定,請設定 CloudFront 將選取的標頭轉送到 Amazon S3。如需詳細資訊,請參閱 根據請求標頭快取內容

包括本文的 GET 請求

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

HTTP 方法

如果設定 CloudFront 處理其支援的所有 HTTP 方法,CloudFront 會接受從檢視器傳來的下列請求,然後將這些請求轉送到您的 Amazon S3 原始伺服器:

  • DELETE

  • GET

  • HEAD

  • OPTIONS

  • PATCH

  • POST

  • PUT

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

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

重要

如果您將 CloudFront 設定為接受 CloudFront 支援的所有 HTTP 方法,並將其轉送至 Amazon S3,則必須建立 CloudFront OAC 以限制對 Amazon S3 內容的存取,並為 OAC 提供必要的許可。例如,如果您設定 CloudFront 接受和轉送這些方法,因為您想要使用 PUT方法,您必須設定 Amazon S3 儲存貯體政策以適當處理DELETE請求,讓檢視器無法刪除您不希望他們刪除的資源。如需詳細資訊,請參閱限制對 Amazon S3 原始伺服器的存取

如需關於 Amazon S3 支援操作的詳細資訊,請參閱 Amazon S3 文件

CloudFront 移除或更新的 HTTP 請求標頭

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

最大請求長度和最大 URL 長度

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

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

如果請求或 URL 超過長度上限,CloudFront 會將 HTTP 狀態碼 413 (請求實體太大) 傳回給檢視器,然後終止與檢視器的 TCP 連線。

OCSP 裝訂

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

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

通訊協定

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

重要

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

查詢字串

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

原始伺服器連線逾時和嘗試次數

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

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

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

如需詳細資訊,請參閱 控制原始伺服器逾時和嘗試

原始伺服器回應逾時

「原始伺服器回應逾時」,也稱為「原始伺服器讀取逾時」或「原始伺服器請求逾時」,適用於以下兩個數值:

  • 在將請求轉送到原始伺服器之後,CloudFront 等待回應的時間 (以秒為單位)。

  • CloudFront 在收到來自原始伺服器的回應封包後,並在接收下一個封包前所等待的時間 (以秒為單位)。

CloudFront 行為取決於檢視器請求的 HTTP 方法:

  • GETHEAD 請求 – 如果原始伺服器未在 30 秒內回應,或是停止回應 30 秒,CloudFront 會結束連線。如果指定的原始伺服器連線嘗試次數超過 1,CloudFront 會再次嘗試取得完整的回應。CloudFront 最多可嘗試 3 次,由「原始伺服器連線嘗試次數」設定的值決定。如果原始伺服器在最後一次嘗試時未回應,則 CloudFront 在收到相同原始伺服器上內容的另一個請求之前不會再嘗試。

  • DELETEOPTIONSPATCHPUTPOST 請求 – 如果原始伺服器未在 30 秒內回應,CloudFront 會結束連線,而且不會再嘗試聯絡原始伺服器。用戶端可以視需要重新提交請求。

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

相同物件之同步請求 (請求折疊)

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

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

如果您想要防止所有請求摺疊,您可以使用受管快取政策 CachingDisabled,這也可防止快取。如需詳細資訊,請參閱使用受管快取政策

如果您想要防止特定物件的請求摺疊,您可以將快取行為的最小 TTL 設定為 0,並將原始伺服器設定為傳送 Cache-Control: privateCache-Control: no-storeCache-Control: no-cacheCache-Control: max-age=0Cache-Control: s-maxage=0。這些組態會增加原始伺服器的負載,並於 CloudFront 等待第一個請求的回應時,為暫停的同步請求引入額外的延遲。

重要

目前,如果您在快取政策原始伺服器請求政策或舊版快取設定中啟用 Cookie 轉送,CloudFront 不支援請求摺疊。

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

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

已取消請求

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

CloudFront 移除或更新的 HTTP 回應標頭

在將 Amazon S3 原始伺服器傳來的回應轉送給檢視器之前,CloudFront 會移除或更新下列的標頭欄位:

  • X-Amz-Id-2

  • X-Amz-Request-Id

  • Set-Cookie – 如果設定 CloudFront 轉送 Cookie,此服務會將 Set-Cookie 標頭欄位轉送給用戶端。如需詳細資訊,請參閱 根據 Cookie 快取內容

  • Trailer

  • Transfer-Encoding – 如果 Amazon S3 原始伺服器傳回此標頭欄位,CloudFront 會將此值設定為 chunked,再將回應傳回給檢視器。

  • Upgrade

  • Via – CloudFront 在對檢視器的回應中將值設為以下值:

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

    例如, 值如下:

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

可快取檔案大小上限

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

使用範圍請求方法來請求每個部分為 50 GB 或更小的多部分物件,即可使用 CloudFront 快取大於此大小的物件。CloudFront 會快取這些部分,因為每個部分皆為 50 GB 或更小。檢視器擷取物件的所有部分之後,就可以重建原始、較大的物件。如需詳細資訊,請參閱 使用範圍請求快取大物件

重新引導

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

注意

如果您重新引導請求到備用網域名稱,您必須藉由新增 CNAME 記錄,為您的網域更新 DNS 服務。如需詳細資訊,請參閱 透過新增備用網域名稱 (CNAMEs來使用自訂 URLs

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

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

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

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

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

  5. 檢視器傳送物件的另一個請求,但這次檢視器指定從 CloudFront 取得的新位置:

    • 如果 Amazon S3 儲存貯體使用 CloudFront 分佈的網域名稱或替代網域名稱,來將所有的請求重新引導到分佈,則 CloudFront 會向 Amazon S3 儲存貯體或新位置中的 HTTP 伺服器請求物件。當新的位置傳回物件時,CloudFront 會將其傳回至檢視器並在節點快取。

    • 如果 Amazon S3 儲存貯體將請求重新引導至另一個位置,則第二個請求會略過 CloudFront。Amazon S3 儲存貯體或新位置中的 HTTP 伺服器,會將物件直接傳回給檢視器,因此一律不會在 CloudFront 邊緣快取中快取物件。