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