Nginx 默认自动响应 Range 请求返回 206 Partial Content,无需手动设置;前提是请求含合法 Range 头、资源为可读静态文件、未禁用 accept_ranges、且代理场景下不丢失 Content-Range 等关键头。

当客户端发起范围请求(Range request)时,Nginx 会自动返回状态码 206 Partial Content,前提是请求头中包含合法的 Range 字段,且资源支持字节范围读取(如静态文件)。你不需要手动设置 206 状态码,Nginx 会在满足条件时自动处理并响应。
确保静态文件支持 Range 请求
Nginx 默认对静态文件(如 .mp4、.zip、.pdf 等)启用字节范围支持,但需确认以下几点:
- 资源必须是本地磁盘上的真实文件(非代理或动态生成内容),否则 Nginx 无法计算长度和切片
- 文件需有明确的
Last-Modified或ETag响应头(Nginx 自动添加) - 确保未禁用
accept_ranges:Nginx 默认发送Accept-Ranges: bytes,不要在配置中用add_header Accept-Ranges "";覆盖它
避免代理场景下丢失 206 响应
如果 Nginx 作为反向代理,后端服务返回了 206,但 Nginx 却转成了 200,常见原因包括:
- 后端未正确设置
Content-Range头(格式如bytes 0-1023/10000),Nginx 会降级为 200 - 启用了
proxy_buffering on且响应体被缓存,导致 Nginx 无法流式传递分块响应;建议对大文件下载设为proxy_buffering off - 使用了
proxy_ignore_headers Content-Range或类似指令,误删了关键头信息
限制或拒绝非法 Range 请求
为防止恶意或过载请求,可在 location 中添加控制逻辑:
- 用
if ($http_range ~ "^bytes=[^,]+(,[^,]+)*$") { ... }粗略校验 Range 格式 - 结合
limit_rate控制单连接下载速度,避免带宽耗尽 - 对不支持 Range 的路径(如 API 接口)显式关闭:
add_header Accept-Ranges "none";,并返回 416(Requested Range Not Satisfiable)
调试与验证方法
可通过 curl 快速验证是否正常返回 206:
-
curl -I -H "Range: bytes=0-1023" https://example.com/file.mp4—— 检查响应头含HTTP/2 206、Content-Range和Content-Length - 用
curl -r 0-1023 https://example.com/file.mp4 -o part.bin下载片段并检查文件大小是否为 1024 字节 - 查看 Nginx error log,若出现
client sent invalid range,说明 Range 解析失败,需检查请求格式或文件可读性











