

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

# CloudFront 如何處理物件的部分請求 (範圍 GET)
<a name="RangeGETs"></a>

針對大型物件，檢視器 (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 中的[範圍請求](https://httpwg.org/specs/rfc7233.html#range.requests)，或者參閱 MDN Web 文件中的[範圍](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range)。

## 使用範圍請求快取大物件
<a name="cache-large-objects-with-range-requests"></a>

啟用快取時，CloudFront 不會擷取或快取大於 50 GB 的物件。當原始伺服器指出物件大於此大小時 (在 `Content-Length` 回應標頭中)，CloudFront 會關閉與原始伺服器的連線，並傳回錯誤給檢視器。(停用快取時，CloudFront 可以從原始伺服器擷取大於此大小的物件，並將其傳遞給檢視器。但是，CloudFront 不會快取物件。)

然而，藉助範圍請求，您可以使用 CloudFront 來快取大於[可快取檔案大小上限](cloudfront-limits.md#limits-web-distributions)的物件。

**Example 範例**  

1.  考慮具有 100 GB 物件的原始伺服器。啟用快取時，CloudFront 不會擷取或快取如此大的物件。不過，檢視器可以傳送多個範圍請求，以擷取多個部分的物件，其中每個部分都小於 50 GB。

1. 檢視器可以請求包含 20 GB 部分的物件，方法是傳送帶有標頭 `Range: bytes=0-21474836480` 的請求來擷取第一個部分，然後傳送帶有標頭 `Range: bytes=21474836481-42949672960` 的另一個請求來擷取下一個部分，依此類推。

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

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

對於壓縮物件的範圍請求，位元組範圍請求是根據壓縮大小，而不是物件的原始大小。如需壓縮檔案的相關資訊，請參閱 [提供壓縮檔案](ServingCompressedFiles.md)。