nginx代理下支持分段下载需透传range和if-range头、cache_key包含$http_range、禁用buffering/gzip/sendfile,并确保cdn开启range透传与回源支持。

要让 Nginx 在代理模式下真正支持分段下载(即断点续传)并兼容 CDN 加速,关键不是只加一行 proxy_set_header Range $http_range,而是整条链路协同:头透传、缓存键区分、响应流式转发、后端真实支持,缺一不可。
必须透传的两个请求头
仅透传 Range 不够,客户端重试或校验时依赖 If-Range 判断是否可安全续传。两者需同时配置:
-
proxy_set_header Range $http_range;—— 把客户端原始 Range 值(如bytes=1024-2047)原样发给后端 -
proxy_set_header If-Range $http_if_range;—— 若客户端携带 ETag 或 Last-Modified,后端据此决定是否返回 206 而非降级为 200
缓存键必须包含 Range 值
启用 proxy_cache 时,若 cache_key 不含 Range,所有分片请求都会命中同一个缓存条目,导致“第一次缓存了 0–1023 字节,后续任何 Range 都返回这段”——断点彻底失效。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
推荐写法:
-
proxy_cache_key "$uri|$http_range";—— 空 Range(全量请求)自动变成/file.zip|,与带范围的 key 天然隔离 -
proxy_cache_valid 200 206 1h;—— 明确允许缓存 206 响应,避免默认忽略
关闭干扰机制,确保流式响应
缓冲、压缩、零拷贝等优化在普通请求中提升性能,但在 Range 场景下会破坏字节偏移逻辑:
-
proxy_buffering off;—— 强制流式透传,防止 Nginx 缓冲整个响应后再发,导致 206 内容被截断或错位 -
gzip off;或gzip_disable "range";—— 压缩后原始字节位置已变,客户端无法按原始 offset 续传 -
sendfile off;—— 某些内核+文件系统组合下,sendfile on与 Range 冲突,建议静态资源走 proxy_pass 时禁用
CDN 加速需额外确认三点
即使 Nginx 配置正确,前置 CDN 仍可能破坏 Range 流程:
- 检查 CDN 控制台是否开启“Range 请求透传”(如 Cloudflare 的 Origin Rules 中启用 “Cache Based on Request Headers: Range”)
- 确认 CDN 回源策略支持 Range 回源(如阿里云 DCDN 的“开启 Range 回源”,分片大小建议设为 512KB~1MB)
- 避免在源站响应头中设置全局强缓存(如
Cache-Control: public, max-age=31536000),否则 CDN 可能直接返回旧的 200 全量缓存,绕过 Range 逻辑










