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要求標頭,請從 TCP 連線 CloudFront 取得檢視器的 IP 位址、新增包含 IP 位址的X-Forwarded-For標頭,並將要求轉寄至原始位址。例如,如果192.0.2.2從 TCP 連接CloudFront 獲取 IP 地址,它會將以下標頭轉發到原點:

X-Forwarded-For: 192.0.2.2

如果檢視器將要求傳送至 CloudFront 並包含X-Forwarded-For要求標頭,則會從 TCP 連線 CloudFront 取得檢視器的 IP 位址,將其附加至X-Forwarded-For標頭的結尾,並將要求轉送至原始位置。例如,如果檢視器要求包含X-Forwarded-For: 192.0.2.4,192.0.2.3192.0.2.2從 TCP 連線 CloudFront 取得 IP 位址,則會將下列標頭轉送至原點:

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,它會在回應中包含一個ETagLastModified值和值。在 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,透過快取中的現有物件提供。

跨來源資源共享 (CORS)

如果您想 CloudFront 要遵守 Amazon S3 跨來源資源共用設定,請進行設定 CloudFront 以將選取的標頭轉寄到 Amazon S3。如需詳細資訊,請參閱 根據要求標頭快取內容

包括本文的 GET 請求

如果檢視器GET要求包含主體,則會將 HTTP 狀態碼 403 (禁止) CloudFront 傳回給檢視器。

HTTP 方法

如果您設定 CloudFront 為處理其支援的所有 HTTP 方法,請CloudFront 接受來自檢視者的以下請求,並將它們轉送到您的 Amazon S3 來源:

  • DELETE

  • GET

  • HEAD

  • OPTIONS

  • PATCH

  • POST

  • PUT

CloudFront 始終緩存響應GETHEAD請求。您也可以設定快取 CloudFront OPTIONS要求的回應。 CloudFront 不會快取回應至使用其他方法的要求。

如果您想要使用多部分上傳將物件新增至 Amazon S3 儲存貯體,則必須將 CloudFront 來源存取控制 (OAC) 新增至您的分發,並授予 OAC 所需的許可。如需詳細資訊,請參閱 限制對 Amazon 簡單存儲服務來源的訪問

重要

如果您設定為 CloudFront 接受並轉寄給 Amazon S3 所有 CloudFront 支援的 HTTP 方法,則必須建立 CloudFront OAC 來限制對 Amazon S3 內容的存取,並將必要的許可授予 OAC。例如,如果您因為想要使用該方法而設定 CloudFront 為接受和轉寄這些PUT方法,則必須設定 Amazon S3 儲存貯體政策以適當處理DELETE請求,以便檢視者無法刪除您不希望使用的資源。如需詳細資訊,請參閱 限制對 Amazon 簡單存儲服務來源的訪問

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

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

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

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

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

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

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

OCSP 裝訂

當檢視者提交物件的 HTTPS 要求時, CloudFront 或檢視者必須向憑證授權單位 (CA) 確認該網域的 SSL 憑證尚未撤銷時。OCSP 裝訂透過允許驗證憑證並快取 CloudFront 來自 CA 的回應來加速憑證驗證,因此用戶端不需要直接向 CA 驗證憑證。

當收到相同網域中物件的許多 HTTPS 要求時,OCSP 裝訂的效能改善 CloudFront會更明顯。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 來源。如需詳細資訊,請參閱 根據查詢字串參數快取內容

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

Origin 連線逾時是嘗試建立與原點的連線時 CloudFront 等待的秒數。

原始連線嘗試次數是 CloudFront 嘗試連線至原點的次數。

這些設定共同決定在容錯移轉至次要原點 (在原始群組的情況下) 或傳回錯誤回應給檢視器之前, CloudFront 嘗試連線到原點的時間長度。根據預設, CloudFront 在嘗試連線至次要原點或傳回錯誤回應之前,會等待 30 秒 (每次嘗試 10 秒)。您可以指定較短的連線逾時、較少的嘗試次數或兩者,以縮短此時間。

如需詳細資訊,請參閱 控制來源逾時和嘗試

原始伺服器回應逾時

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

  • 將要求轉送至來源之後 CloudFront 等待回應的時間量 (以秒為單位)。

  • 接收來自來源的回應封包之後,以及在接收下一個封包之前 CloudFront 等待的時間量 (以秒為單位)。

CloudFront 行為取決於查看器請求的 HTTP 方法:

  • GETHEAD請求 — 如果來源在 30 秒內沒有回應或停止回應 30 秒,請中CloudFront 斷連線。如果指定的來源連線嘗試次數超過 1 次,請再次 CloudFront 嘗試取得完整的回應。 CloudFront 嘗試最多 3 次,由原始連線嘗試設定的值決定。如果來源在最後一次嘗試期間 CloudFront沒有回應,在收到另一個相同來源的內容要求之前,不要再試一次。

  • DELETEOPTIONSPATCHPUT、和POST請求 — 如果來源在 30 秒內沒有回應,請中 CloudFront 斷連線,而不會再次嘗試聯絡來源。用戶端可以視需要重新提交請求。

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

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

當 CloudFront 節點位置收到對象的請求,並且該對象不在緩存中或緩存的對象已過期時,請 CloudFront 立即將請求發送到源。但是,如果同一物件有同時要求 (也就是說,如果相同物件 (具有相同快取金鑰) 的其他要求在 CloudFront 收到第一個要求的回應之前抵達邊緣位置,則會在將額外要求轉送至原始位置之前CloudFront 暫停。這個短暫的暫停有助於減少原點的負載。 CloudFront 將原始請求的響應發送到暫停時收到的所有請求。這就是所謂的請求摺疊。在 CloudFront 記錄檔中,第一個要求會在x-edge-result-type欄位Miss中識別為,而收合的要求會識別為Hit. 如需 CloudFront 記錄檔的詳細資訊,請參閱CloudFront 和邊緣功能記錄

CloudFront 只會收合共用快取金鑰的要求。如果其他要求不共用相同的快取金鑰,例如,您設定為根據要求標頭、Cookie 或查詢字串進行快取,則會 CloudFront 將具有唯一快取金鑰的所有要求 CloudFront 轉寄至您的來源。

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

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

重要

目前, CloudFront 如果您在快取原則、原始要求原則或舊版快取設定中啟用 Cookie 轉送,則不支援要求收合。

如何 CloudFront 處理來自 Amazon S3 來源的回應

了解如何 CloudFront 處理來自 Amazon S3 來源的回應。

已取消請求

如果物件不在邊緣快取中,並且檢視器在從原始物件取 CloudFront 得物件之後終止工作階段 (例如,關閉瀏覽器),則 CloudFront 不會在邊緣位置快取該物件。

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

CloudFront 在將 Amazon S3 來源的回應轉送給檢視器之前,先移除或更新下列標頭欄位:

  • X-Amz-Id-2

  • X-Amz-Request-Id

  • Set-Cookie— 如果您配置 CloudFront 轉發 cookie,它會轉發標Set-Cookie題字段到客戶端。如需詳細資訊,請參閱 根據餅乾緩存內容

  • Trailer

  • Transfer-Encoding— 如果您的 Amazon S3 來源傳回此標頭欄位,請在將回應傳回給檢視器chunked之前將值 CloudFront 設定為。

  • Upgrade

  • Via— 在對檢視器的回應中將值 CloudFront 設定為下列項目:

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

    例如,該值如下所示:

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

可快取檔案大小上限

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

您可以使用範圍要求 CloudFront 來要求每個 50 GB 或更小的部分來要求物件,藉此快取大於此大小的物件。 CloudFront緩存這些部分,因為它們每個都是 50 GB 或更小。檢視器擷取物件的所有部分之後,就可以重建原始、較大的物件。如需詳細資訊,請參閱 使用範圍請求快取大物件

重新引導

您可以設定 Amazon S3 儲存貯體,將所有的請求重新引導到另一個主機名稱,這可以是另一個 Amazon S3 儲存貯體或 HTTP 伺服器。如果您將值區設定為重新導向所有要求,而且儲存貯體是 CloudFront發佈的來源,建議您將儲存貯體設定為使用 CloudFront 分發的網域名稱 (例如 d111111abcdef8.cloudfront.net) 或與分發相關聯的備用網域名稱 (CNAME),將所有要求重新導向至分發。否則,瀏覽器請求略過 CloudFront,並直接從新來源提供對象。

注意

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

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

  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 邊緣快取中快取物件。