如何 CloudFront 處理物件 (範圍GETs) 的部分要求 - Amazon CloudFront

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

如何 CloudFront 處理物件 (範圍GETs) 的部分要求

針對大型物件,檢視器 (Web 瀏覽器或用戶端) 可能提出多個 GET 請求,並使用 Range 請求標頭下載分為多個較小部分的物件。這些位元範圍的請求,有時稱為 Range GET 請求,改善部分下載的效率與從部分失敗的傳輸復原。

當 CloudFront 收到Range GET請求時,它會檢查接收請求的邊緣位置中的緩存。如果該邊緣位置中的快取已包含整個物件或物件的要求部分,請 CloudFront 立即從快取提供要求的範圍。

如果緩存不包含請求的範圍,請將請求 CloudFront 轉發到來源。(若要最佳化效能, CloudFront 可能會要求比Range GET. 中要求的用戶端更大的範圍) 接下來,會發生什麼狀況取決於原始伺服器是否支援 Range GET 請求:

  • 如果來源支持Range GET請求-它返回請求的範圍。 CloudFront 為請求的範圍提供服務,並將其緩存以供 future 請求使用。(Amazon S3 支援Range GET請求,與許多HTTP伺服器一樣。)

  • 如果來源不支持Range GET請求-它返回整個對象。 CloudFront 通過發送整個對象來提供當前請求,同時還將其緩存以供 future 請求使用。在邊緣緩存中緩存整個對象之 CloudFront 後,它通過服務Range GET請求的範圍響應新的請求。

在任何一種情況下,只要第一個字節從原點到達,就會 CloudFront 開始向最終用戶提供請求的範圍或對象。

注意

如果檢視器提出要Range GET求且 origin 傳回Transfer-Encoding: chunked,則會將整個物件 CloudFront 傳回給檢視器,而不是要求的範圍。

CloudFront 通常遵循Range標題的RFC規範。但是,如果您的Range標頭不符合下列要求,則會CloudFront 傳回200包含完整物件的HTTP狀態碼,而不是206具有指定範圍的狀態碼:

  • 必須以遞增順序列出的範圍。例如,100-200,300-400 是有效的,300-400,100-200 是無效的。

  • 範圍不得重疊。例如,100-200,150-250 是無效的。

  • 所有範圍規格必須有效。例如,您無法指定負值為範圍的一部分。

如需有關Range要求標頭的詳細資訊,請參閱 RFC 7233 中的範圍或 MDN Web 文件中的範圍。

使用範圍請求快取大物件

啟用快取時, CloudFront 不會擷取或快取大於 50 GB 的物件。當來源指示物件大於此大小 (在回Content-Length應標頭中) 時,請 CloudFront 關閉與原點的連線,並將錯誤傳回給檢視器。(停用快取功能後, CloudFront 可以從原點擷取大於此大小的物件,並將其傳遞給檢視器。 但是, CloudFront 不會緩存對象。)

不過,對於範圍要求,您可以使用 CloudFront 來快取大於可快取檔案大小上限的物件。

範例
  1. 考慮一個具有 100 GB 對象的來源。啟用快取後, CloudFront不會擷取或快取這麼大的物件。不過,檢視器可以傳送多個範圍請求,以擷取多個部分的物件,其中每個部分都小於 50 GB。

  2. 檢視者可以透過傳送含有標頭擷取第一部分的要求、另一個含有標頭Range: bytes=0-21474836480擷取下一部分的要求,以此類推來要求 20 GB 部分的物件。Range: bytes=21474836481-42949672960

  3. 檢視器收到所有的部分之後,它可以將這些部分組合起來建構原始的 100 GB 物件。

  4. 在此情況下,會 CloudFront 快取物件的每個 20 GB 部分,並且可以回應快取中相同零件的後續要求。