nginx 默认支持range断点续传,需确保未禁用max_ranges、慎用sendfile与gzip、静态location直供文件、代理时透传range头并定制cache_key。

要让 Nginx 正确响应 Range 请求、实现静态资源断点续传,核心不是“开启某项功能”,而是避免配置干扰,并确保请求头、缓存、传输机制三者协同一致。Nginx 1.1.3+ 默认就支持 Range,只要路径正确、文件可读、关键配置没被误关,206 响应自然生效。
确认基础配置未禁用 Range 功能
以下几项会直接破坏断点续传,需逐项检查:
-
删除或修正 max_ranges 0;——该指令会彻底关闭所有 Range 请求,建议删掉,或设为合理值如
max_ranges 10; -
谨慎使用 sendfile;——某些内核或小文件场景下,
sendfile on;与 Range 冲突,若验证失败可临时改为sendfile off; -
避免 gzip 干扰二进制文件;——对 zip/mp4/iso 等大文件,启用 gzip 会导致 Content-Range 计算错误;推荐加
gzip_disable "range";或对这类 location 显式设gzip off;
静态文件 location 必须满足基本条件
仅当 Nginx 直接提供文件(root/alias)时,Range 才能自动触发。需确保:
- 文件真实存在、权限可读、大小可获取(stat() 成功)
- location 中未被
rewrite、auth_basic、satisfy或limit_req等指令中途拦截跳过原处理流程 - 未使用
try_files指向非静态处理器(如 PHP 脚本),否则 Range 不生效 - 响应头中自动包含
Accept-Ranges: bytes和正确的Content-Range(无需手动 add_header)
代理场景下必须透传 Range 相关请求头
若 location 使用 proxy_pass(例如回源到后端服务或 CDN),Nginx 默认不转发 Range 头,需显式补全:
-
proxy_set_header Range $http_range;——将客户端的 Range 值原样传给后端 -
proxy_set_header If-Range $http_if_range;——配合 Range 避免条件不匹配导致整包返回 -
proxy_pass_request_headers on;——确保其他必要头不丢失 - 建议加
proxy_cache_bypass $http_range;或直接proxy_cache off;,防止 206 响应被错误缓存
启用缓存时必须区分不同 Range 请求
如果启用了 proxy_cache,默认 cache_key 只含 $uri,所有 Range 请求都会命中同一缓存条目,造成“断点失效”。必须重构 cache_key:
- 推荐写法:
proxy_cache_key "$uri|$http_range";——简洁且兼容空值(全量请求时$http_range为空,key 自动变为/file.zip|) - 必须配
proxy_cache_valid 206 1h;,否则 Nginx 默认不缓存 206 响应
用 curl 快速验证是否生效:curl -I -H "Range: bytes=0-1023" https://your-domain.com/file.zip
成功响应应含 HTTP/1.1 206 Partial Content、Accept-Ranges: bytes 和 Content-Range: bytes 0-1023/12345678。若返回 200,说明某环节阻断了 Range 处理。











