Nginx 开了全局 gzip_types text/plain,robots.txt 也跟着被压缩。Google 能正常解压,百度抓取诊断显示规则解析为空,屏蔽全部失效。
一开始怀疑是「压缩后的文件里保留了原始 BOM,解压后第一行带不可见字符」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。百度请求 robots 时没带 Accept-Encoding,服务端仍返回压缩体。另一种情况是CDN 对 robots 做了强制压缩,响应头与实体不一致。
少数情况下是同一路径下 gzip_static 命中了旧的 .gz 文件。
第一件事是检查响应头与实体是否匹配
curl -sI -H 'Accept-Encoding: identity' https://www.example.com/robots.txt
接着对 robots 关闭压缩
gzip off;
再往下删掉静态目录里的旧压缩副本
find /var/www -name 'robots.txt.gz' -delete
末了按百度 UA 复验一次
curl -A 'Baiduspider' -s https://www.example.com/robots.txt | head -10
恢复的判定其实很直接。identitiy 请求返回未压缩的纯文本,百度抓取诊断能正确读出 Disallow 行,参数页抓取量在 48 小时内明显回落。
这里还有个坑。robots 这类小文件没必要压缩,关掉它能省掉一整类兼容问题,代价只有几百字节。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
