先给结论:测试工具能访问、实际用户却失败,通常不是robots.txt本身写错了,而是两者发出的请求在“来源路径、请求头、解析器行为”上存在差异。复现的关键,是把测试工具的成功请求与用户的失败请求逐项对齐,找出那条被忽略的条件,再回到robots.txt里验证它是否真的被规则覆盖。
这个矛盾有两种常见来源。第一种是规则差异:测试工具请求的是A路径,用户请求的是B路径,而robots.txt里恰好只对B路径设了限制。第二种是环境差异:两者请求同一路径,但测试工具绕过了用户实际经过的入口,比如CDN、反向代理、跳转链或带参数的URL。
区分办法是看失败是否随URL变化。如果换一个路径就成功,问题更可能在规则;如果同一路径换网络、换设备仍然失败,问题更可能在环境或请求特征。
很多测试工具默认发送通用User-Agent,而真实用户浏览器发送的是完整UA字符串,还可能带Referer、Cookie、Accept-Language。如果robots.txt里按UA片段做了分组,测试工具用的UA可能落在允许组,用户浏览器却落在受限组。
实际动作:把用户浏览器开发者工具里“网络”面板的请求头完整复制出来,用命令行工具带同样的UA和Referer重新请求一次robots.txt对应的路径。如果此时失败,而改成通用UA就成功,说明遗漏条件是UA分组,而不是文件位置或语法。
不同抓取方对robots.txt的解析细节并不完全一致,包括通配符*、结束符$、大小写、百分号编码和空行处理。测试工具可能按一种解析方式判定允许,用户侧的实际抓取方按另一种方式判定禁止。
可操作的做法是:把robots.txt里涉及该路径的规则逐条抄出,用Disallow和Allow的先后顺序手工推演一遍。若同一路径同时被更宽的通配规则和更窄的允许规则覆盖,要确认哪条在前。顺序不同,结果可能相反。
假设某站点robots.txt写的是Disallow: /search?,测试工具请求的是/search,自然成功;用户点击站内搜索后实际访问的是/search?q=abc,就落入禁止范围。这里遗漏条件是“带参数的完整URL”,而非域名或协议。
验证动作:分别请求裸路径和带参数路径,比较返回结果。如果只有带参数版本被拦,下一步应决定是收窄规则、改用更精确的路径,还是确认该参数页是否真需要抓取。
需要提醒的是,robots.txt的抓取限制不等于可靠的索引移除;站点地图也不保证收录,HTTPS同样不保证安全无漏洞或排名。复现条件只是让判断有据可依,最终是否调整规则,还要结合该路径对抓取和展示的实际价值来决定。