先别把问题归因到 robots 协议本身。更可能的解释是:带参数的 URL 在抓取环节被合并、被规则拦截,或者页面返回内容随参数变化,而 robots 规则只是其中一层。缩小复现条件的核心动作是固定一个变量——只改参数、不改路径和请求环境,看异常是否稳定跟随该参数出现。如果稳定跟随,下一步才去核对 robots 规则与参数处理逻辑;如果不跟随,问题在别处。
带参数的 URL 出现异常,常见有三种彼此独立的原因,需要分开验证。
这三类的判断依据不同。规则层看 robots.txt 的模式匹配;规范化层看页面里的 canonical 和抓取日志中的 URL 形态;内容层直接对比两次请求的响应体。混在一起看,就会得出“robots 有问题”的错误结论。
把“部分正常、部分异常”变成可核对的对照,只需要控制变量。假设同一路径 /list 下,/list 正常,/list?page=2 异常,/list?sort=price 也异常,而 /list?page=2&sort=price 正常。这个假设例子说明:异常不是简单跟随“有参数”出现,而是跟随特定参数或参数组合出现。
具体动作是列一张最小对照表,每行只改一个变量:
结果如何影响下一步:如果异常只在某个参数名出现、换值仍异常,方向指向规则匹配或参数白名单;如果换值就恢复正常,方向指向内容层或缓存;如果叠加参数后异常消失,说明存在组合匹配规则,需要回到 robots.txt 逐条比对模式。
robots.txt 的 Disallow 是按路径前缀匹配的,不是正则。判断某个带参数 URL 是否被拦,不能只看规则字面,要按 URL 的路径与查询串逐段比对。常见误判是:规则写的是 Disallow: /*?page=,但实际生效范围取决于具体实现对该写法的支持程度,不同抓取方对通配符和查询串的处理并不一致,必须分别核查。
可核对的证据有两类:一是 robots.txt 的原文与版本时间,确认规则何时改动;二是抓取日志中该 URL 的请求记录,确认它是否真的被请求过。这里有个容易踩的坑:日志里看不到某个 URL,不等于它被 robots 拦了。它也可能从未被发现、被规范化合并、被站点地图遗漏,或抓取预算分配到了别处。请求量为零有多种合理解释,不能单独作为规则生效的证明。
另外要记住,robots.txt 的抓取限制不等于可靠的索引移除。即使某个带参数 URL 被 Disallow,它仍可能因为外部链接而被收录,只是抓取受限。用 robots 来处理参数页面的索引问题,本身就是一个需要重新评估的取舍。
确认异常来源后,面对带参数 URL 通常有三种处理方向,各自成立的条件不同。
不要三种同时上。先做一个方向的最小改动,观察抓取日志和页面返回是否按预期变化,再决定是否推进到下一个方向。
开发、SEO 和运维对同一异常常有不同理解:开发认为参数正常返回,SEO 看到的是抓取缺失,运维看到的是日志里没有请求。分歧无法靠讨论解决,要靠把每个说法变成一条可核对的事实。
可行的做法是建一张核对表,每条包含:URL 原样、请求时间、响应状态码、响应体是否含目标内容、robots.txt 当时版本、是否出现在站点地图。填完后,多数分歧会收敛到具体某一层。需要提醒的是,站点地图不保证收录,它只是提交候选,不能作为“已处理”的证据。
如果核对后仍指向 robots 规则,再安排最小修复试验:只改一条规则,记录改动前后同一组 URL 的请求记录变化。若变化符合预期,再扩大范围;若没有变化,说明该规则并非瓶颈,应回到规范化或内容层继续查。整个过程不承诺具体见效时间,只以可复查的记录为准。