问题出现得很突然,日志倒是留得挺全。站点在根目录放了自定义 robots.txt,同时主题里用 filter 动态输出了一份。访问时前者被后者覆盖,运维改的 Disallow 规则一条没生效,爬虫日志看不出任何变化。
刚开始盯着「修改后没有对比实际返回内容,只看了文件本身」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。WordPress 的 do_robots 会接管 /robots.txt 的响应。少数情况下是主题代码里挂了 robots_txt 过滤器,优先级高于静态文件。
不容易想到的是,静态文件与过滤器输出各维护一份 长期不同步。
上来先看实际返回的内容来自哪里
curl -s https://www.example.com/robots.txt | head -20
随后确认过滤器是否被注册
add_filter('robots_txt', 'my_robots', 20, 2);
接着统一由一处输出并删掉静态文件
rm robots.txt && curl -s https://www.example.com/robots.txt
等前面都确认过,再核对规则与线上是否一致
curl -s https://www.example.com/robots.txt | grep -c 'Disallow'
怎么算真的好了,看的是同一批现象。统一到过滤器输出后,线上 robots 与配置文件完全一致,被误挡的 /wp-content/ 恢复抓取,图片索引开始回升。
虚拟路由和静态文件同时存在时以虚拟路由为准,排查 robots 一定要看 curl 的结果,别只看目录里的文件。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
