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

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

CloudFront 如何處理物件的部分請求 (範圍 GET)

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

當 CloudFront 收到 Range GET 請求時,會檢查收到請求之節點中的快取。如果節點中的快取已包含整個物件或物件的請求部分,則 CloudFront 會立即從快取提供請求的範圍。

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

  • 如果原始伺服器支援Range GET請求 – 它會傳回請求的範圍。CloudFront 會提供請求的範圍,並同時進行快取來回應未來的請求。(如同許多 HTTP 伺服器一樣,Amazon S3 支援 Range GET 請求。)

  • 如果原始伺服器不支援Range GET請求 – 它會傳回整個物件。CloudFront 會針對目前的請求傳送整個物件,並同時進行快取來回應未來的請求。CloudFront 在邊緣快取中快取整個物件之後,會提供請求的範圍以回應新的 Range GET 請求。

在這兩種情況下,只要第一位元組從原始伺服器送達,CloudFront 就會立即開始提供請求的範圍或物件給最終使用者。

注意

如果檢視器提出 Range GET 請求,而原始伺服器傳回 Transfer-Encoding: chunked,CloudFront 會將整個物件 (而非請求的範圍) 傳回至檢視器。

一般來說,CloudFront 遵循適用於 Range 標頭的 RFC 規格。但是,如果您的 Range 標頭未遵循下列要求,CloudFront 會傳回包含完整物件的 HTTP 狀態碼 200,而非包含指定範圍的狀態碼 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來擷取第一個部分、另一個具有 標頭的請求Range: bytes=21474836481-42949672960來擷取下一個部分,以 20 GB 部分的形式請求物件,以此類推。

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

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