编码代理与终端 · 收录于 2026-08-29 · 适用 1 工具 ✓ 实测验证

大文件下载中断后无法续传(curl: (33) HTTP server does not seem to support byte ranges)

已验证 2026-08-29curl 大文件中断无法续传——先 Range 探测(206=支持续传),支持就 curl -C - 续传,不支持只能换源或整包重下。

快速修复

# 一键:先探测服务器是否支持 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 同款)。

其它环境的表现

环境说明
支持 Rangecurl -C - 直接续传(实测 206 + Content-Range 链路)
不支持 Range换源 / aria2c / 整包重下
python3 -m http.server3.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——本地调试断点续传时别用它。

解法

  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(aria2c -c URL,多线程分段下载,对源要求更高); 或直接整包重下(部分文件删掉,避免误用不完整文件)。

  1. 下载工具/脚本里:先检查 -C - 返回码,33 时告警而不是静默当成功;

续传完成后务必校验哈希(md5sum -c / sha256),部分文件拼接错位很隐蔽。

  1. 本地测试断点续传:用 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 · 外部工具

来源与证据

收录 验证 ✓ 实测验证适用 1 工具
方案含本地实测或来源可复核的解法;未实测项已在文中如实标注。

素材来源:https://github.com/keenerd/packer/issues/136

← 编码代理与终端 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡