运维给 robots.txt 加了 ETag 缓存,客户端带 If-None-Match 时直接回 304 空响应。改了 Allow 规则之后,GSC 里 robots 测试工具读到的仍是旧内容,蜘蛛访问日志里看不到新的抓取。
把日志和配置对完,能解释这个现象的基本就这几处。静态文件被前端缓存层接管,浏览器与蜘蛛都拿到了 304;304 响应体为空,蜘蛛按上次缓存的内容继续执行;没有给 robots.txt 单独关掉协商缓存;前置的 WAF 也会缓存 robots 响应体 改完两边内容不一致。
模拟带条件的请求看实际响应
curl -sI -H 'If-None-Match: "abc"' https://www.example.com/robots.txt
然后让 robots 每次都回完整内容
location = /robots.txt { add_header Cache-Control 'no-cache'; etag off; }
接着清掉边缘节点上的 robots 副本
curl -X PURGE https://www.example.com/robots.txt
剩下的就是确认响应体与状态码都正常
curl -s -o /dev/null -w '%{http_code} %{size_download}\n' https://www.example.com/robots.txt
改完先别撤,确认这几项。关掉协商缓存后 robots 稳定返回 200 和完整正文,GSC 测试工具里的规则当天就更新了,被误挡的目录重新出现抓取。
补一句。robots.txt 是低频小文件,缓存的收益可以忽略,直接禁止协商缓存最省心,别在这里做优化。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
