先给有条件的结论:只有当测试工具与真实用户请求在来源 IP、User-Agent、请求路径、协议版本、DNS 解析结果、边缘节点缓存状态这六项中至少一项不同,并且差异恰好落在 robots.txt 规则或服务器处理逻辑的判定边界上时,测试工具能访问而实际用户失败才可能被稳定复现。若这六项全部一致却仍出现分歧,那么问题多半不在 robots.txt 规则本身,而在工具的报告方式、缓存层或客户端渲染环节,此时继续改规则只会掩盖真正原因。
测试工具通常只报告“能否取到响应”,而用户看到的是浏览器最终呈现的页面。两者之间至少隔着 DNS、TCP/TLS、HTTP 响应、缓存和前端渲染五层。要复现条件,第一步是把失败归类:
把失败归到第三类却去改 robots.txt 规则,是常见的误判方向。
测试工具与用户的请求差异,可以用一组可对照的字段来定位。假设测试工具返回 200,而用户侧失败,按下面顺序核对:
/Private/ 与 /private/ 在多数实现中被视为不同路径。工具访问的是被允许的变体,用户访问的是被禁止的变体,就会出现分歧。核对时不要只看工具的成功截图,要同时抓取工具与用户两侧的完整请求头与响应头。缺少响应头对照时,“工具能访问”这个结论本身就不足以支撑任何判断。
假设某站点 robots.txt 写有 Disallow: /search/,测试工具请求 /search/?q=test 返回 200,而部分用户访问同一路径得到 403。此时不要立刻断定规则失效。更可能的解释是:工具请求命中了已缓存的允许响应,而用户请求触发了 WAF 对查询参数的拦截。验证动作是:用同一路径、同一 UA、不同来源 IP 各请求一次,并记录响应头中的缓存标识与拦截标识。如果只有来源 IP 变化就导致结果翻转,那么问题在 WAF 而非 robots.txt 规则;如果改变路径大小写才翻转,问题才回到规则匹配本身。这个例子的数字与路径均为说明比较方法的假设,不代表任何真实站点。
如果测试工具与用户请求在六项条件上完全一致,却依然出现“工具成功、用户失败”,那么前面“差异导致分歧”的结论就不成立。此时更合理的解释包括:工具缓存了上一次的成功结果、工具并未真正发起网络请求、用户侧浏览器扩展或本地 hosts 干扰、或用户看到的是旧缓存页面。这种情况下继续调整 robots.txt 规则不会改变结果,反而会让线上规则偏离真实需求。判断依据是:当两侧请求头与响应头完全对齐后仍无法复现,就应停止改规则,转向客户端与缓存排查。
具体动作是:用同一台机器、同一网络、同一 UA 分别以测试工具和浏览器访问目标路径,记录两组响应状态与响应头。若两组一致,说明此前观察到的分歧来自环境而非规则,下一步应排查缓存与客户端;若两组不一致,则把差异字段逐一单独改变,一次只改一项,找出使结果翻转的那一项。只有确认翻转项确实落在 robots.txt 规则的匹配范围内时,才去修改规则。修改后仍需用相同方法复测,而不是凭一次成功请求就认为已修复。需要说明的是,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录,因此即使抓取恢复正常,索引结果仍需单独核查。