快速修复
# 一键:先探测服务器是否支持 Range(206=支持,200=不支持)
curl -sI -H "Range: bytes=0-99" URL
支持就 curl -C - -o 文件 URL 续传;不支持就换源或整包重下。
你会遇到什么
下载大文件(模型、镜像、数据集)中断后想续传:curl -C - -o model.bin URL 报 curl: (33) HTTP server does not seem to support byte ranges. Cannot resume.,curl 退出、文件保持部分状态;换 wget -c 同样失败。不是你的命令写错,是服务器不支持断点续传。
本文路径:快速修复(30 秒一段命令)→ 一步步排查(可跳读)→ 原理与变体(症状/原因/证据)。赶时间直接跳到「快速修复」。
为什么会这样
HTTP 断点续传依赖 Range 头:客户端发 Range: bytes=N-,服务器返回 206 Partial Content + Content-Range。服务器不支持(返回 200 全量或 416)时,curl 无法拼接,只能报 33 放弃。
常见于:小型自建服务器/内网下载站、python3 -m http.server(3.14 实测不支持 Range)、某些网盘直链。
| 服务器 | Range 支持 |
|---|---|
| nginx / CDN / 对象存储 | ✅ 支持(默认) |
| python3 -m http.server(3.14) | ❌ 实测不支持 |
| 小型自建/网盘直链 | 看实现 |
断点续传是「客户端 Range + 服务器 206」的协议协商:curl 发 Range: bytes=N-,服务器支持就返回 206 Partial Content + Content-Range 告诉它从哪续;不支持就返回 200(全量)或 416(范围不合法)——curl 无法在「从头开始的 200 全量」上拼接,只能报错 33 放弃。
所以续传失败 = 服务器没实现 Range,不是 curl 或网络问题。
python3 -m http.server 在 3.14 实测不支持 Range;nginx/CDN/对象存储默认支持。
确定性推论:curl -C - 报 33 先探服务器:curl -I -H "Range: bytes=0-0" <url> 看返回 206 还是 200/416;206 = 支持续传,200/416 = 服务器不支持,换下载通道(nginx/CDN/对象存储)或用支持断点的工具(wget -c 对部分服务器同协议,同样依赖 206);判断路径固定:失败点不在客户端。
一步步来
1. 先探测服务器是否支持 Range — 排查
curl -sI -H "Range: bytes=0-99" URL
返回 206 支持,返回 200 不支持。
2. 支持就续传 — 必做
curl -C - -o 文件 URL
自动从已有文件大小继续;wget 用 wget -c URL。
3. 不支持 Range 的源 — 必做
换支持 Range 的下载源(CDN/对象存储/官方镜像站);或 aria2c -c URL(多线程分段下载,对源要求更高);或直接整包重下(删掉部分文件,避免误用不完整文件)。
4. 脚本里处理 33 — 必做
curl -C - -o file URL || echo "续传失败,检查服务器 Range 支持"
下载工具/脚本里先检查 -C - 返回码,33 时告警而不是静默当成功;续传完成后务必校验哈希(md5sum -c / sha256),部分文件拼接错位很隐蔽。
怎么确认修好了
续传成功且哈希一致(实测输出形态):
curl -C - -o part.bin URL
→ exit 0,md5 与源文件一致(实测 4211ba8d)
失败链路:不支持 Range 的服务器 → curl: (33) exit 33(实测,与 packer#136 同款)。
其它环境的表现
| 环境 | 说明 |
|---|---|
| 支持 Range | curl -C - 直接续传(实测 206 + Content-Range 链路) |
| 不支持 Range | 换源 / aria2c / 整包重下 |
| python3 -m http.server | 3.14 实测不支持 Range,本地调试别用 |
| 探测法 | curl -sI -H "Range: bytes=0-99",206 vs 200 |
| 本地测试 | 用 nginx(默认支持)或自写 206 服务器 |
症状
下载大文件(模型、镜像、数据集)中断后想续传:
$ curl -C - -o model.bin https://example.com/model.bin
** Resuming transfer from byte position 10485760
curl: (33) HTTP server does not seem to support byte ranges. Cannot resume.
特征:curl -C - 从已下载位置续传,但服务器不支持 Range 请求(或忽略 Range 返回 200 全量); 报错 33 后 curl 退出,文件保持部分状态;换 wget -c 同样失败。
原因
HTTP 断点续传依赖 Range 头:客户端发 Range: bytes=N-,服务器返回 206 Partial Content + Content-Range。 若服务器不支持(返回 200 全量或 416),curl 无法拼接,只能报 33 放弃。 常见于:小型自建服务器/内网下载站、python3 -m http.server(3.14 实测不支持 Range)、某些网盘直链。 注意:python 的 http.server 在新版本里已不支持 Range——本地调试断点续传时别用它。
解法
- 先探测服务器是否支持 Range:
curl -sI -H "Range: bytes=0-99" URL——返回206支持,返回200不支持。 - 支持就续传:
curl -C - -o 文件 URL(自动从已有文件大小继续);wget 用wget -c URL。 - 不支持 Range 的源:换支持 Range 的下载源(CDN/对象存储/官方镜像站);
或换 aria2c(aria2c -c URL,多线程分段下载,对源要求更高); 或直接整包重下(部分文件删掉,避免误用不完整文件)。
- 下载工具/脚本里:先检查
-C -返回码,33 时告警而不是静默当成功;
续传完成后务必校验哈希(md5sum -c / sha256),部分文件拼接错位很隐蔽。
- 本地测试断点续传:用 nginx(默认支持 Range)或自写 206 服务器;别用 python3 -m http.server。
验证证据
- 本地实测(2026-08-29,WSL Ubuntu,curl 8.x,50MB 随机文件,纯本地):
- 成功链路:自写支持 Range 的服务器(206 + Content-Range)→
timeout 0.3 curl -o part.bin中断得 15.5MB 部分文件 →
curl -C - -o part.bin 续传 exit 0,md5 与源文件一致(4211ba8d);
- 失败链路:不支持 Range 的服务器(忽略 Range 恒返回 200 全量)→ 部分文件 10MB 续传 →
curl: (33) HTTP server does not seem to support byte ranges. Cannot resume.(exit 33),与 packer#136 同款;
- 冷知识对照:
python3 -m http.server(3.14.4)对-C -同样报 33——新版本 http.server 不支持 Range,本地调试别用; - 探测法验证:
curl -sI -H "Range: bytes=0-99"对自写服务器返回 206,对 norange/http.server 返回 200。 - 实测复现日志(2026-08-29)
适用工具 (1)
本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。
curl · 外部工具来源与证据
← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡