视频拖动进度条时每次都从头下载,请求带了 Range: bytes=1048576-,响应状态是 200,Content-Length 是整个文件大小,没有 206。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,动态压缩会改变字节偏移,服务器没法按原始位置切片,干脆忽略 Range 返回全量。压缩层把 Accept-Ranges 也一并去掉了。客户端看到 200 只能从头读。

「Range 与 gzip」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

curl -sI http://127.0.0.1/media/demo.mp4 -H 'Range: bytes=0-1023'
# 期望 206 Partial Content 和 Content-Range

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,对支持 Range 的资源关闭动态压缩 或直接预压缩成静态文件;确认响应里有 Accept-Ranges: bytes;检查 CDN 回源时是否透传了 Range 头;用 curl 带 Range 验证状态码是不是 206。

最后用这个标准收尾,带 Range 的请求返回 206 Content-Range 正确 播放器拖动后不再从头加载。

作者 9823189