robots txt,同一地址因设备或登录状态返回不同内容怎样对照

📍 WDQWDWQD987AAAAA:216.73.216.98
📱 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
🔗 /00891da63560.html
📄

robots txt,同一地址因设备或登录状态返回不同内容怎样对照

先给有条件的结论:如果同一 URL 在未登录与登录、桌面与移动设备下返回的 robots.txt 内容不同,应把它当成“服务端按请求特征分流”的问题,而不是缓存或浏览器差异。对照时要固定请求身份(User-Agent、Cookie、IP、协议),逐项记录响应头与正文,再判断哪一份才是搜索引擎抓取时真正看到的内容。若无法复现出稳定差异,或差异只出现在你无法控制的 CDN 边缘节点上,这个结论就不成立,需要换用服务器日志或源站直连来验证。

为什么“同一地址不同内容”多半不是缓存问题

robots.txt 按规范应是一个静态资源,但很多旧系统会把它交给应用层动态生成。当应用根据登录 Cookie、设备类型或内部灰度标记返回不同规则时,就会出现同一路径多种正文。常见的可区分原因有三类:

这三类的处理动作不同。身份分流要确认搜索引擎爬虫是否携带登录态(通常不会),设备分流要确认爬虫 UA 落在哪一分支,边缘分流则要回源比对。把它们混在一起,就会误判为“robots.txt 被改了”。

对照前先固定请求变量

要让对照有意义,必须让除一个变量外的其他条件保持一致。建议按下面的顺序执行:

  1. 用同一台机器、同一出口 IP,分别以未登录和登录状态请求 /robots.txt,保存完整响应头与正文。
  2. 用桌面 UA 与移动 UA 各请求一次,记录 Content-Length、ETag、Last-Modified 和 Vary 头。
  3. 若怀疑边缘分流,直接请求源站 IP 并带上 Host 头,与经 CDN 的结果对比。

这个动作的结果会直接决定下一步:如果响应头里出现 Vary: Cookie 或 Vary: User-Agent,说明分流是设计好的,需要去应用层找规则来源;如果各次响应头完全一致但正文不同,则更可能是缓存键设置错误或节点间数据不同步。

判断哪一份才是抓取方看到的内容

对照的目的不是找出“哪份对”,而是确认抓取方实际拿到哪份。搜索引擎爬虫通常不带登录 Cookie,UA 也有固定标识,因此登录态返回的那份往往不是它看到的。可以用服务器访问日志交叉验证:查找带有主流爬虫 UA 的 /robots.txt 请求,看它命中的响应大小与哪一份本地抓取结果吻合。

这里有一个反例会让上述推断失效:如果站点对爬虫 IP 段做了单独回源或单独规则,日志里看到的响应可能与你在本机任何身份下抓到的都不同。此时本地对照只能证明“存在分流”,不能证明“爬虫看到的是哪一份”,必须依赖源站配置或爬虫抓取测试工具的实际返回。

还要注意,robots.txt 的抓取限制不等于可靠的索引移除。即使某份规则屏蔽了路径,已收录页面仍可能保留一段时间;站点地图也不保证收录。因此对照结果只用于确认规则可见性,不能当作删除内容的依据。

一个注明假设的短例子

假设某站点登录后 robots.txt 多出一行 Disallow: /preview/,未登录时没有这一行。若爬虫不带登录态,它看到的是未登录版本,/preview/ 仍可被抓取。此时的正确动作不是删掉登录分支,而是把该路径的屏蔽规则合并进未登录版本,或在应用层对爬虫身份统一返回同一份规则。做完后重新按上面的固定变量抓取,确认各身份返回的正文与响应头一致,再检查日志中爬虫请求的响应大小是否同步变化。

如果合并后仍存在差异,说明分流点不在应用层,而在更前面的代理或 CDN,需要继续向源站方向排查,直到找到唯一一份对外生效的规则为止。

图1 图2

nginx