范围请求让客户端请求表示的一部分。媒体播放器、可断点续传的下载工具与诊断客户端会用到它,但服务器如果错误地声明或返回范围,就可能产生静默损坏,而不是干净的失败。
建立完整大小
抓取完整表示的响应头,并记录其长度与验证器:
url=https://www.example.test/downloads/archive.tar.gz
curl -sS -D full.headers -o /dev/null "$url"
awk 'tolower($1) ~ /^(content-length:|etag:|last-modified:|accept-ranges:)$/ { print }' full.headers
Accept-Ranges: bytes 是显式信号,但缺少这个头并不能证明范围请求不受支持。去实际请求一次。
请求一个已知区间
请求开头 16 字节,同时保留响应头与正文:
curl -sS -D range.headers -o range.body \
-H 'Range: bytes=0-15' "$url"
wc -c range.body
awk 'tolower($1) ~ /^(content-range:|content-length:|etag:)$/ || /^HTTP\// { print }' range.headers
成功的字节范围响应应使用 206 Partial Content。Content-Range 应指出 0-15 与完整表示长度,而正文应正好包含 16 个字节。
测试一个不可能的区间
请求超出已知末尾的字节:
curl -sS -D - -o /dev/null \
-H 'Range: bytes=999999999-' "$url"
对无法满足的字节范围,416 Range Not Satisfiable 加一个类似 bytes */12345 的 Content-Range 值会暴露真实长度。当服务器忽略 Range 时返回 200 也可能合法,但它必须返回完整表示,而不是一个标签错误的片段。
让验证器留在故事里
续传工具可以用 If-Range 配合强验证器或日期。如果表示已改变,安全响应是完整的最新表示,而不是从两个版本拼接出的字节。在宣称某个下载"可续传"之前,先测试这一行为。
来源
- RFC 9110 — HTTP Semantics,范围单位、部分响应与
Content-Range,已核验 2026-08-23。 - curl manual,
--range与响应头选项,已核验 2026-08-23。