本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
如何 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 中的範圍
使用範圍請求快取大物件
啟用快取時, CloudFront 不會擷取或快取大於 50 GB 的物件。當來源指示物件大於此大小 (在回Content-Length
應標頭中) 時,請 CloudFront 關閉與原點的連線,並將錯誤傳回給檢視器。(停用快取功能後, CloudFront 可以從原點擷取大於此大小的物件,並將其傳遞給檢視器。 但是, CloudFront 不會緩存對象。)
不過,對於範圍要求,您可以使用 CloudFront 來快取大於可快取檔案大小上限的物件。
範例
-
考慮一個具有 100 GB 對象的來源。啟用快取後, CloudFront不會擷取或快取這麼大的物件。不過,檢視器可以傳送多個範圍請求,以擷取多個部分的物件,其中每個部分都小於 50 GB。
-
檢視者可以透過傳送含有標頭擷取第一部分的要求、另一個含有標頭
Range: bytes=0-21474836480
擷取下一部分的要求,以此類推來要求 20 GB 部分的物件。Range: bytes=21474836481-42949672960
-
檢視器收到所有的部分之後,它可以將這些部分組合起來建構原始的 100 GB 物件。
-
在此情況下,會 CloudFront 快取物件的每個 20 GB 部分,並且可以回應快取中相同零件的後續要求。