Range header
HTTP Range 請求頭指示伺服器應返回資源的一部分。可以在一個 Range 頭中同時請求多個部分,伺服器可能會在多部分文件中返回這些範圍。如果伺服器返回範圍,它會使用 206 Partial Content 狀態碼進行響應。如果範圍無效,伺服器會返回 416 Range Not Satisfiable 錯誤。
不支援範圍請求的伺服器可能會忽略 Range 頭並返回整個資源以及 200 狀態碼。較舊的瀏覽器使用 Accept-Ranges: none 響應頭來停用下載管理器中的“暫停”或“恢復”等功能,但由於伺服器忽略 Range 頭與響應 Accept-Ranges: none 具有相同的含義,因此該頭很少以這種方式使用。
目前只有 bytes 單元被註冊,它們是偏移量(零索引且包含)。如果請求的資料應用了 內容編碼,則每個位元組範圍表示編碼後的位元組序列,而不是解碼後獲得的位元組。
當指令指定單個位元組範圍時,該頭是 CORS 安全列表請求頭。
語法
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 位元組
Range: bytes=0-499
請求接下來的 500 位元組
Range: bytes=500-999
省略結束位置會請求資源的所有剩餘單元,因此可以使用以下方法請求長度為 1000 位元組的資源的最後 100 位元組
Range: bytes=900-
或者,如果不知道資源有多大,可以使用 -n 的字尾範圍請求最後 n 位元組
Range: bytes=-100
請求多個範圍
給定一個長度為 10000 位元組的資源,以下示例請求三個獨立的範圍;200-999(800 位元組)、2000-2499(500 位元組),最後是 9500-。範圍說明符值 9500- 省略了結束位置,這表明從 9500 開始的所有位元組都是第三個範圍的一部分(500 位元組)。
Range: bytes=200-999, 2000-2499, 9500-
此示例請求檔案的最初 500 位元組和最後 500 位元組。如果這些範圍重疊(例如,如果請求的資源小於 1000 位元組),請求可能會被伺服器拒絕。
Range: bytes=0-499, -500
檢查伺服器是否支援範圍請求
以下 curl 命令對影像發出 HEAD 請求
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 請求
HEAD /z4d4kWk.jpg HTTP/1.1
Host: i.imgur.com
User-Agent: curl/8.7.1
Accept: */*
伺服器響應 200,並且存在 Accept-Ranges: bytes 頭(為簡潔起見省略了一些頭)
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 146515
Content-Type: image/jpeg
…
Accept-Ranges: bytes
從 blob URL 獲取範圍
blob: URL 也透過使用 fetch() 支援範圍請求。
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 |
瀏覽器相容性
載入中…