先看现象。上线压缩模块后,蜘蛛抓 https://www.example.com/ 返回 206 Partial Content,Content-Range 显示 0-8191/148233,抓到的正文只有开头一段,索引里的描述变成半句话。

原因不止一个,得分开看。gzip_static 和 slice 模块同时开启,静态文件被切片返回。另一种情况是CDN 回源请求带了 Range 头,源站没忽略就按范围响应。

少数情况下是部分 UA 命中了试验中的分段下发规则。

带 Range 头复现一次

curl -sI -H "Range: bytes=0-8191" https://www.example.com/ | head -8

然后对 HTML 关闭切片只保留压缩

location = / { gzip_static on; slice off; }

剩下的就是确认正文长度与首页一致

curl -s https://www.example.com/ | wc -c

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

白天有业务在跑,能验证的部分都压到了晚上做。

当时还开着另一个排查窗口,两边日志对照着看才定位到。

怎么算真的好了,看的是同一批现象。首页返回 200 且 Content-Length 与本地文件一致,抓取统计里首页下载大小恢复到 140KB 左右,索引描述重新变成完整句子。

容易忽略的是,206 对下载器是好事,对蜘蛛是灾难,凡是 HTML 都不要走 Range 分发。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189