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

浏览器兼容性

另见