想挡掉带 ?sort= 的排序页,运维在 robots 里写了 Disallow: /*(sort|order)=,Google 勉强识别一部分,百度直接整行忽略,排序页一天还是被抓两万次。

一开始怀疑是「同一行混用多个通配符,解析器读到一半就放弃」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。robots 协议只支持 * 和 $ 两个通配符,不支持正则分组。少数情况下是括号和竖线被当成普通路径字符,规则匹配不到任何地址。

少数情况下是靠 robots 挡参数页本来就不彻底,已收录地址也不会删除。

先把规则拆成两条基础通配

Disallow: /*?sort=

随后确认线上实际返回的规则

curl -sI https://www.example.com/robots.txt

再往下在页面上补 noindex 兜底

add_filter('wp_robots', 'wp_robots_noindex');

剩下的就是统计参数页剩余抓取量

grep -c '?sort=' access.log

恢复的判定其实很直接。改完一周后排序页抓取量下降八成,抓取诊断能读到两条新规则,索引里的排序页开始减少。

robots 的通配能力很弱,复杂匹配要靠服务端 301 或 noindex,别指望一条正则解决。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189