Range header

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

HTTP Range 請求頭指示伺服器應返回資源的一部分。可以在一個 Range 頭中同時請求多個部分,伺服器可能會在多部分文件中返回這些範圍。如果伺服器返回範圍,它會使用 206 Partial Content 狀態碼進行響應。如果範圍無效,伺服器會返回 416 Range Not Satisfiable 錯誤。

不支援範圍請求的伺服器可能會忽略 Range 頭並返回整個資源以及 200 狀態碼。較舊的瀏覽器使用 Accept-Ranges: none 響應頭來停用下載管理器中的“暫停”或“恢復”等功能,但由於伺服器忽略 Range 頭與響應 Accept-Ranges: none 具有相同的含義,因此該頭很少以這種方式使用。

目前只有 bytes 單元被註冊,它們是偏移量(零索引且包含)。如果請求的資料應用了 內容編碼,則每個位元組範圍表示編碼後的位元組序列,而不是解碼後獲得的位元組。

當指令指定單個位元組範圍時,該頭是 CORS 安全列表請求頭

頭型別 請求頭
禁止請求頭

語法

http
Range: <unit>=<range-start>-
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, …, <range-startN>-<range-endN>
Range: <unit>=-<suffix-length>

指令

<unit>

定義範圍的單位。目前只有 bytes 是註冊單位。

<range-start>

給定單位中的整數,指示請求範圍的起始位置。

<range-end>

給定單位中的整數,指示請求範圍的結束位置。此值是可選的,如果省略,則將資源的末尾用作範圍的末尾。

<suffix-length>

一個整數,指示要返回的資源末尾的單位數量。

示例

以下示例展示瞭如何使用 Range 頭進行 CORS 安全列表請求以及請求多個範圍。其他示例可以在 HTTP 範圍請求 指南中找到。

單個位元組範圍和 CORS 安全列表請求

當值為單個位元組範圍時,Range 頭是 CORS 安全列表請求頭。這意味著它可以在跨域請求中使用,而不會觸發 預檢 請求,這對於請求媒體和恢復下載很有用。

以下示例請求資源的最初 500 位元組

http
Range: bytes=0-499

請求接下來的 500 位元組

http
Range: bytes=500-999

省略結束位置會請求資源的所有剩餘單元,因此可以使用以下方法請求長度為 1000 位元組的資源的最後 100 位元組

http
Range: bytes=900-

或者,如果不知道資源有多大,可以使用 -n 的字尾範圍請求最後 n 位元組

http
Range: bytes=-100

請求多個範圍

給定一個長度為 10000 位元組的資源,以下示例請求三個獨立的範圍;200-999(800 位元組)、2000-2499(500 位元組),最後是 9500-。範圍說明符值 9500- 省略了結束位置,這表明從 9500 開始的所有位元組都是第三個範圍的一部分(500 位元組)。

http
Range: bytes=200-999, 2000-2499, 9500-

此示例請求檔案的最初 500 位元組和最後 500 位元組。如果這些範圍重疊(例如,如果請求的資源小於 1000 位元組),請求可能會被伺服器拒絕。

http
Range: bytes=0-499, -500

檢查伺服器是否支援範圍請求

以下 curl 命令對影像發出 HEAD 請求

bash
curl -v --http1.1 -I https://i.imgur.com/z4d4kWk.jpg
# or using the OPTIONS method:
# curl -v --http1.1 -X OPTIONS https://i.imgur.com/z4d4kWk.jpg

這將導致以下 HTTP 請求

http
HEAD /z4d4kWk.jpg HTTP/1.1
Host: i.imgur.com
User-Agent: curl/8.7.1
Accept: */*

伺服器響應 200,並且存在 Accept-Ranges: bytes 頭(為簡潔起見省略了一些頭)

http
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 146515
Content-Type: image/jpeg
…
Accept-Ranges: bytes

從 blob URL 獲取範圍

blob: URL 也透過使用 fetch() 支援範圍請求。

js
const blob = new Blob(["Hello, world!"], { type: "text/plain" });
const url = URL.createObjectURL(blob);
fetch(url, {
  headers: {
    Range: "bytes=7-11",
  },
})
  .then((response) => response.text())
  .then((text) => console.log(text)); // "world"

規範

規範
HTTP 語義
# field.range

瀏覽器相容性

另見