Nginx 默认支持 HTTP Range 断点续传,需确保未禁用 max_ranges、sendfile 配置合理、响应含 Accept-Ranges 和 Content-Range 头,并在代理场景透传 Range 头、避免缓存干扰及权限问题。

Nginx 默认已支持 HTTP Range 请求,只要文件服务配置得当、响应头正确,断点续传就能正常工作,无需额外模块或复杂开关。
确认基础配置未禁用范围请求
Nginx 1.1.3+ 版本默认开启 range 支持,但需确保没被显式关闭。检查配置中是否包含以下禁用项:
-
max_ranges 0;—— 会完全禁用 Range 功能,应删除或设为非零值(如max_ranges 10;) -
disable_symlinks ...;若路径涉及符号链接且配置不当,可能间接导致 206 响应失败 -
sendfile on;在某些内核或文件系统下与 Range 冲突(尤其小文件),可临时关掉测试:sendfile off;
确保静态文件响应含正确头部
断点续传依赖服务器返回 Accept-Ranges: bytes 和正确的 Content-Range。Nginx 对静态文件(location 中使用 alias 或 root + try_files)会自动添加这些头,前提是:
- 请求带合法
Range: bytes=xxx-yyy头 - 文件存在、可读、大小明确(不支持动态内容如 PHP 脚本的 Range)
- 未被其他模块(如 gzip、slice)干扰:若启用了
gzip on;,建议对大文件关闭压缩:gzip_disable "msie6|range";
验证与调试方法
用 curl 快速验证是否生效:
curl -I -H "Range: bytes=0-999" http://your-site.com/file.zip
成功响应应包含:
HTTP/1.1 206 Partial ContentAccept-Ranges: bytesContent-Range: bytes 0-999/12345678Content-Length: 1000
若返回 200 而非 206,说明 Range 未触发——检查请求头是否拼写错误(如写成 range 小写在某些客户端可能被忽略)、Nginx 日志是否有 range not satisfiable 提示。
常见踩坑点
-
代理场景下丢失 Range 头:上游服务(如后端应用)不支持 Range,而 Nginx 又没配置
proxy_set_header Range $http_range;和proxy_pass_request_headers on; -
缓存干扰:CDN 或反向代理缓存了 200 响应,后续 Range 请求仍返回全量内容。需确保缓存策略识别 Range 头,例如加
Cache-Control: no-cache, no-store或配置缓存键包含$http_range - 文件权限或 SELinux:Nginx worker 进程无权读取文件,或 SELinux 策略阻止部分 I/O 操作,会导致 200 回全量或直接 403/500










