nginx 默认支持 http range 请求,可为静态大文件天然提供断点续传能力;需避免 proxy_buffering、gzip、sub_filter 等干扰指令,正确配置 location 与后端透传 range 头,并通过 curl 验证 206 响应。

Nginx 默认就支持 HTTP Range 请求,因此只要配置得当,无需额外模块或脚本,就能为静态大文件(如视频、安装包)天然提供断点续传能力。关键在于 location 块中不破坏原始响应头、不启用会禁用 Range 的功能(如缓冲、压缩代理),并确保后端(如有)也支持分片。
确保 location 不干扰 Range 请求
很多断点续传失效,是因为 location 中启用了不兼容 Range 的指令。以下配置要避免:
-
不要在 serving 静态文件的 location 中设置
proxy_buffering on或proxy_cache——它们可能合并响应、丢弃部分 Range 内容; -
避免对大文件启用
gzip on(尤其在 location 级别)——gzip 会重写响应体和 Content-Length,导致 Range 失效; -
不要用
sub_filter或add_before_body等内容改写指令——它们强制读取完整响应,破坏流式分片。
推荐的静态大文件 location 配置
假设大文件放在 /data/uploads/,通过 /dl/ 路径访问:
location ^~ /dl/ {
alias /data/uploads/;
# 启用 Range 支持(默认已开启,显式写出更清晰)
add_header Accept-Ranges bytes;
# 可选:限制只允许 GET/HEAD,防止误操作
limit_except GET HEAD {
deny all;
}
# 可选:禁止索引目录
autoindex off;
}
注意:alias 末尾的 / 必须与 location 路径结尾一致;若用 root,路径拼接逻辑不同,需格外小心。
对接后端(如 FastAPI/Node.js)时的关键点
如果文件由后端动态生成或鉴权后返回(非纯静态),Nginx 作为反向代理时需透传 Range 相关头,并确保后端正确响应:
- 在 proxy location 中添加:
proxy_pass_request_headers on;(默认开启,但建议显式确认); - 透传关键请求头:
proxy_set_header Range $http_range;和proxy_set_header If-Range $http_if_range;; - 后端必须检查
Range请求头,返回206 Partial Content、正确的Content-Range和Accept-Ranges: bytes; - Nginx 默认会转发后端的
Content-Range和Accept-Ranges,无需额外设置。
验证是否生效的简单方法
用 curl 模拟断点续传请求:
# 获取文件前 1024 字节 curl -i -H "Range: bytes=0-1023" https://example.com/dl/big.zip <h1>查看响应头是否含:</h1><h1>HTTP/2 206</h1><h1>Accept-Ranges: bytes</h1><h1>Content-Range: bytes 0-1023/10485760</h1><h1>Content-Length: 1024</h1>
若返回 200 OK 或缺失 Content-Range,说明 Range 未生效,需检查 location 是否被其他配置覆盖、是否有 gzip/sub_filter 干扰、或后端未正确处理。











