先给结论:不要把“同一 URL 内容不同”直接归因到 robots 文件设置,而要把对照拆成两条线——抓取身份线和响应内容线。前者看请求头、来源 IP 和 UA 是否被服务端区别对待,后者看返回的 HTML、状态码和跳转是否随设备或登录态变化。只有当 robots.txt 对不同 UA 返回不同规则,或登录后页面路径被重写时,robots 才真正参与问题;否则它只是被误判的旁观者。
抓取工具拿到的内容与浏览器不同,常见原因有三类:一是服务端按 UA、Cookie 或 IP 做了分流;二是页面本身依赖登录态渲染;三是 robots.txt 针对不同 UA 返回了不同规则。三者可以同时存在,因此需要分别取证。
一个可操作的区分动作是:用同一台机器、同一出口 IP,只改变请求头中的 User-Agent,对比两次响应。如果两次返回的正文不同,而 robots.txt 内容相同,那么差异来自服务端分流,不是 robots 规则。如果两次 robots.txt 内容不同,才需要把 robots 规则本身作为变量纳入对照。
这一步的结果会直接决定下一步:分流问题要回到服务端配置和缓存策略,robots 问题才回到规则文本。把两者混在一起,往往会反复修改 robots.txt 却看不到变化。
条件一:目标内容对匿名访客可见,登录只是附加功能。此时应以匿名身份为主做对照,因为搜索引擎抓取通常不带登录 Cookie。若匿名返回的正文与浏览器匿名模式一致,而登录后不同,说明差异由登录态引起,robots 文件设置通常不是主因。
条件二:目标内容只在登录后出现。此时匿名抓取拿不到正文属于预期,不能用匿名结果证明 robots 规则有问题。应改为核对登录后页面是否使用了不同的 URL 路径,以及这些路径是否被 robots.txt 的 Disallow 命中。若登录后内容被放在 /member/ 一类路径下,而该路径被禁止抓取,那么即使内容真实存在,也不代表它可以被抓取和索引。
选择依据可以归纳为一句:先确认“谁在看”,再确认“看到的是不是同一个 URL”。身份不同、URL 不同,对照就没有可比性。
为了让对照可复查,建议固定以下变量,并逐项记录:
其中“最终跳转地址”容易被忽略。若匿名请求被 302 到登录页,而登录请求返回 200,那么两次拿到的正文必然不同,但这与 robots 规则无关。把跳转链记录下来,可以避免把重定向误判为内容差异。
假设某站点对移动端 UA 返回精简版页面,对桌面 UA 返回完整版页面,同时 robots.txt 对所有 UA 返回相同规则。此时用移动 UA 抓取,看到正文较短;用桌面 UA 抓取,看到正文较长。若据此判断“robots 文件设置导致内容缺失”,方向就错了——robots 规则并未区分 UA,差异来自服务端按 UA 输出不同模板。
反过来,假设 robots.txt 对某个 UA 返回了额外的 Disallow 行,而该 UA 恰好是抓取工具使用的身份,那么抓取工具可能直接跳过目标路径。此时需要核对的是:这条规则是否是有意为之,以及它是否同时影响了其他正常抓取身份。若规则只针对某个测试 UA,而正式抓取身份未被限制,那么问题范围就缩小到测试配置本身。
robots.txt 的抓取限制不等于可靠的索引移除。即使某路径被 Disallow,已经收录的 URL 仍可能出现在结果中,因为限制抓取与移除索引是两件事。同理,站点地图不保证收录,HTTPS 也不保证安全无漏洞或排名提升,这些都不能作为判断 robots 对照是否成功的依据。
另外,请求量或抓取量下降不能单独证明 robots 规则处理正确。缓存、服务端限流、网络波动、抓取预算调整都可能造成类似现象。若观察到抓取量归零,应先排查这些合理解释,再回到 robots 规则本身。
不同搜索引擎对 robots.txt 的支持范围和解释细节需要分别核查,不能假定一处生效即处处生效。对照时应以目标搜索引擎实际抓取身份为准,而不是用任意一个 UA 的结果代替。
最后,如果对照后确认差异来自登录态而非 robots 规则,下一步应转向登录后内容的 URL 设计和抓取身份管理;如果确认差异来自 robots 规则本身,则回到规则文本,逐行核对是否有多余的 Disallow 或 UA 分组。动作不同,后续验证方式也不同。