这个坑值得记一笔。为了防止筛选页被抓,在 robots.txt 里写了 Disallow: /product/*?color= 这条规则,Google 那边生效得很干脆,百度的日志里筛选页照样每天被抓几万次。站点同时向两家提交,百度的抓取频次等级还因为大量重复页掉了一档。
刚开始盯着「Disallow 路径和真实目录只差一个前缀 匹配不上」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。百度对通配符只支持末尾的 * 中间出现星号整行被忽略;规则里的问号没转义 被当成另一个通配符解析;同一段规则被后面更宽的 Allow 覆盖 实际放行了全部。
第一件事是确认百度蜘蛛拿到的文件内容
curl -s -A 'Baiduspider' https://www.example.com/robots.txt
接着把中间的星号改成只匹配后缀的写法
Disallow: /product/?color=
然后用参数过滤让筛选页回 301 而不是靠 robots
if ($arg_color) { return 301 /product/; }
末了对比两家蜘蛛的抓取日志验证规则
grep -E 'Baiduspider' access.log | grep '/product/' | wc -l
改完先别撤,确认这几项。改完一周后百度日志里带 color 参数的请求从每天三万降到几百,抓取频次等级回升到二档,重复页面也被逐步清出索引。
robots 的通配符各家的实现差别很大,复杂规则最好换成服务端跳转,别把收口完全押在一行文本上。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
