这个坑值得记一笔。站点开了 Brotli,CDN 没配 Vary: Accept-Encoding,不支持 br 的蜘蛛拿到压缩流,日志显示 200 但正文是乱码,抓取内容全是空白。
刚开始盯着「蜘蛛请求头里 Accept-Encoding 只有 gzip」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。缓存键只按 URL,压缩版和非压缩版混存;Vary 头缺失,边缘无法区分客户端能力;源站强制 br,不看客户端是否支持。
第一件事是看响应里的 Vary 头
curl -sI https://www.example.com/post-1/ -H "Accept-Encoding: gzip" | Select-String "Vary|Content-Encoding"
补上 Vary 头
add_header Vary Accept-Encoding;
随后按客户端能力选择压缩算法
brotli on;
brotli_static on;
gzip on;
模拟蜘蛛请求复核正文
curl -s https://www.example.com/post-1/ -H "Accept-Encoding: gzip" -H "User-Agent: Googlebot" | Select-Object -First 3
这类改动我都写进变更记录,过两周再出问题时能对上号。
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
怎么算真的好了,看的是同一批现象。不同 Accept-Encoding 拿到对应编码,正文可正常解析,日志里不再出现乱码请求。
压缩和缓存必须一起考虑,Vary 少一项就会把错误的版本发给蜘蛛。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
