结论先给:当查询参数可以自由组合、数量没有上限时,robots.txt 里逐个写死 Disallow 路径无法覆盖全部地址,正确做法是改用带通配符的模式规则,把"无限集合"压缩成有限条规则;但代价是通配符匹配范围容易过宽,必须用真实 URL 样本反查验证,而不是写完就认为覆盖完整。
一个常见的困境是:站点发现带参数的地址被大量抓取,于是把出现过的参数路径一条条加进 robots.txt。规则从几条涨到几十条,抓取日志里却仍能看到新的参数组合被访问。这并不矛盾,而是说明处理对象本身是无限的。
以筛选页为例,假设地址形如 /list?color=red&size=m&page=2,三个参数各有若干取值,组合数就是乘积。今天补上 color 的规则,明天又冒出 size 与 page 的新组合。只要参数维度还在增加,枚举法在数学上就永远追不上。
面对"加了规则仍被抓"的现象,通常有两种解释,它们指向完全不同的动作。
解释一:规则写漏了。 认为有效地址是有限的,只是自己没列全,于是继续追加 Disallow 行。这个解释成立的条件是:参数取值封闭、维度固定,且你确实能穷举。此时继续补规则是合理的,代价是维护成本随维度线性上升。
解释二:集合本身无限。 认为参数可自由组合、维度会持续增长,任何枚举都只是抽样。这个解释成立的条件是:地址由用户或多条件筛选动态生成,取值不受控。此时继续补规则的代价是永远补不完,必须转向模式匹配。
两者不是对错问题,而是适用条件不同。判断依据不是"规则数量多少",而是参数空间是否封闭。
能区分这两种解释的证据,来自抓取日志里新增地址的构成,而不是规则条数。
这里要提醒一点:抓取量下降或某条规则命中数归零,并不能单独证明处理正确。抓取减少也可能来自站点整体流量波动、抓取预算被其他路径占用,或搜索引擎临时调整了抓取节奏。需要结合日志时间分布和路径占比一起看,而不是只看一个总数。
假设筛选页都挂在 /list 下,参数可任意组合。一种写法是:
Disallow: /list?*
这条规则把 /list 后带任意查询串的地址都纳入限制,用一条规则覆盖了原本无限的组合。代价是:如果 /list 下存在你希望被抓取的规范地址,比如 /list?category=books 这种用于分类入口的地址,它也会被一并挡掉。这就是模式规则的过宽风险。
更稳的做法是先确认哪些参数组合对应真实有价值的页面,把它们单独放行,其余用模式限制。放行规则要写在限制规则之前,因为 robots.txt 按最长匹配、同长度取首个匹配的规则生效。写完后的实际动作是:从日志里抽出 20 到 50 条真实 URL,逐条对照规则判断命中结果,确认该抓的没被挡、该挡的确实被挡。这个动作的结果直接决定下一步——若发现误伤,就调整放行规则的粒度;若仍有大量漏网,说明前缀假设不成立,需要按路径重新分组。
需要注意,robots.txt 的抓取限制不等于可靠的索引移除。已经被抓取并建立索引的地址,即使之后被限制抓取,也可能仍留在结果里。若目标是让地址从索引中消失,需要另外的移除手段,robots.txt 不是替代品。
把"有效地址集合"定义清楚,才能判断模式规则是否够用。建议按以下顺序确定:
另外,不同搜索引擎对通配符和规则语法的支持情况需要分别核查,不能假定一套写法在所有引擎下行为一致。站点地图可以辅助发现规范地址,但它不保证这些地址被收录,因此不能把"放进站点地图"当作集合定义完成的标志。
回到最初的问题:参数组合无限增长时,有效地址集合不应通过枚举来定义,而应通过"路径前缀加参数模式"来定义,再用少量放行规则圈出必须保留的规范页。判断该用枚举还是模式,取决于参数空间是否封闭;验证是否定义正确,取决于真实 URL 样本的反查结果,而不是规则条数或抓取总量的变化。