视频拖动进度后画面花屏,声音和画面对不上,抓包看到同一个 Range 请求返回的 Content-Range 起点和请求的不一致,X-Cache 是 Hit。日志里能对上时间点,这种反而好排。
缓存层把 206 当成完整响应存了下来,后续不同 Range 的请求都命中这一份。分片的偏移对不上,播放器拼出来的数据就是错的。206 必须按 Range 值区分缓存键。这一点先确认清楚,后面就不用反复试。
curl -sI https://example.com/v/demo.mp4 -H 'Range: bytes=0-1023' | grep -iE 'content-range|x-cache' curl -sI https://example.com/v/demo.mp4 -H 'Range: bytes=2048-3071' | grep -i content-range
「206 被缓存」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
处理上按这个顺序:CDN 上把 206 排除出缓存 或把 Range 纳入缓存键;视频改成整文件缓存加支持 Range 的源站;检查边缘是否合并了不同 Range 的请求;用不同起点各请求一次对比 Content-Range。
结果对不对很好判断,不同 Range 返回各自的 Content-Range 播放器拖动后画面正常 不再花屏。
