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 |
浏览器兼容性
加载中…