先不要改线上 robots.txt。把异常页面的完整 URL 拆成“路径 + 参数键值对”,固定其他变量,只让一个参数或一组参数变化,逐次请求并记录返回状态与抓取结果。能稳定复现的那组条件,才是下一步要处理的对象;如果每次结果都不同,问题更可能出在缓存、CDN 或请求头,而不是规则本身。
“部分页面正常”通常只是肉眼观察,不能直接当证据。你需要先固定三件事:用同一个抓取工具或命令行客户端、带同样的 User-Agent、在相近时间发起请求。然后对每个 URL 记录三项结果:HTTP 状态码、返回内容是否为预期页面、抓取工具是否报告被 robots 规则拦截。
这样做的原因是,同一个参数 URL 可能因为缓存命中、跳转链或 UA 差异呈现不同结果。把状态码和内容分开记录,才能避免把“返回 200 但内容是错误页”误判为正常。假设一个列表页 /list?page=2 正常,而 /list?page=2&sort=price 异常,先确认两者是否经过同一跳转、是否命中同一缓存键,再谈规则。
不要一次测试十几个 URL 再凭印象归类。按下面的顺序做,每一步只改变一个因素:
?sort=price,记录结果。?sort=price&page=2,记录结果。?page=2&sort=price,看结果是否变化。?sort=,观察是否仍异常。如果异常只在“两个参数同时出现”时发生,说明问题可能来自服务端路由或参数拼接,而不是 robots.txt 里的某条 Disallow。如果异常只跟参数顺序有关,优先检查缓存键和 URL 规范化,而不是抓取规则。这一步的实际动作是形成一张对照记录;它的结果会直接决定你下一步是改规则、改缓存,还是交给后端排查。
拿到稳定复现的参数组合后,再回到 robots.txt。逐条检查是否存在匹配该路径的 Disallow、Allow 或通配符规则,并注意规则是按路径前缀匹配的,不是按参数语义匹配的。常见误判是把 Disallow: /*?sort= 当成只拦截排序参数,实际上它可能连带拦截所有含该字符串的 URL。
同时要区分两件事:robots.txt 的抓取限制不等于可靠的索引移除。一个 URL 被抓取工具报告为“被 robots 拦截”,只说明抓取行为受限,不能据此推断它一定不会出现在搜索结果中。反过来,某条规则没有拦截某个参数 URL,也不代表该 URL 会被收录。判断影响范围时,把“抓取是否发生”和“索引是否存在”分开记录,避免用一个指标解释全部现象。
假设某站商品筛选页 /goods?color=red 正常,而 /goods?color=red&size=m 异常。按变量控制法测试后,发现只要同时出现两个参数就异常,单独出现任一参数都正常。此时更合理的解释是服务端对多参数组合返回了错误页或跳转,而不是 robots.txt 中某条规则只针对“两个参数”。
下一步动作应是抓取该组合 URL 的响应头,确认是否有 301、302 或 5xx,再检查缓存层是否把该组合缓存成了错误内容。如果响应头正常、内容也正常,只是抓取工具报告被拦截,才回到 robots.txt 逐条核对。这个顺序能避免在规则文件里反复修改却找不到原因。
如果同一参数组合在多次请求中结果不稳定,或者只有特定 UA、特定地区、特定时间异常,那么继续在 robots.txt 里找答案的收益很低。此时应把已记录的对照表、响应头和复现步骤交给后端或运维,说明“哪些条件稳定、哪些条件不稳定”。robots.txt 只控制抓取许可,不负责修复参数路由、缓存键或服务端错误。把这个边界说清楚,比继续改规则更接近问题本身。