先给结论:不能只用一台设备、一种登录状态下的抓取结果判断robots.txt是否生效。正确做法是把“同一URL”拆成至少两条对照路径——匿名设备A与匿名设备B、匿名与已登录,分别请求同一路径,记录HTTP状态、响应头和正文首段,再判断差异来自服务端分流、CDN缓存还是登录态模板。下面用一个假设情境把决策过程写清。
假设某站点有/special/一个路径,运维在手机浏览器打开https://example.com/robots.txt看到Disallow: /special/,在桌面浏览器打开同一地址却看到Allow: /special/。此时不能直接认定“robots协议坏了”,也不能只改一条规则就收工。先要回答的是:这两个响应是不是同一个资源?如果不是,后面所有判断都要分开做。
第一步动作:用curl -A指定两种User-Agent,分别请求同一路径,并加上-i保留响应头。结果如果出现不同的Content-Length、不同的ETag或不同的Vary,说明服务端很可能按设备或缓存键返回了不同文件。这个结果会直接决定下一步:先统一资源,再谈规则修改;如果响应头完全一致而正文不同,则要查应用层模板或边缘节点改写。
要让差异可解释,至少固定以下变量,否则对照没有意义:
/robots.txt与/robots.txt?可能落到不同缓存键。动作与结果的关系很直接:如果登录后返回的robots.txt多了Disallow,而匿名返回没有,这通常说明登录态被应用层当作独立站点处理,此时应把登录态响应视为另一份资源,而不是把它当作“正确版本”去覆盖匿名版本。
证据是响应头里出现Vary: User-Agent,或不同UA下ETag不同。此时同一地址实际对应多个缓存对象。处理动作:在源站或CDN层把robots.txt的缓存键固定为路径,不纳入UA和Cookie;改完后重新用两种UA请求,若响应头与正文一致,再进入规则核对。
证据是匿名请求返回静态文件、已登录请求返回应用生成的文本,且已登录响应带有会话相关响应头。此时不能假设登录用户看到的规则会被搜索引擎采用。处理动作:确认搜索引擎抓取通常以匿名身份进行,把匿名响应作为对外规则基线;登录态差异只作为内部功能问题记录,不直接用于修改对外robots.txt。
证据是同一UA在不同节点返回不同正文,或刷新后短时间内在两个版本间跳动。处理动作:先查缓存键与回源策略,再决定是否清缓存。清缓存只是恢复一致性的手段,不等于规则本身正确;清完后仍要重新对照匿名与登录两条路径。
个别样本一致,不代表全站一致。假设你抽查了10个路径,9个匿名与登录返回相同,只有1个不同。此时不能把“多数一致”当作可以忽略例外,也不能因为1个例外就推翻全部规则。合理边界是:把例外路径单独列出,确认它是否被独立应用、独立缓存或独立重写;只有确认例外来自可复现的分流机制,才把处理范围限定在该路径,而不是全站重写。
还要注意,robots.txt的抓取限制不等于可靠的索引移除。即使某路径在匿名抓取中被Disallow,已收录页面仍可能出现在结果中,因为限制抓取与移除索引是不同动作。站点地图也不保证收录,HTTPS同样不保证安全无漏洞或排名。不同搜索引擎对同一规则的支持情况须分别核查,不能拿一个引擎的对照结果直接推断另一个。
如果请求量、抓取量或某项统计归零,也不能单独证明处理正确。归零还可能来自抓取预算变化、节假日流量波动、日志采样口径改变或监控本身失效。下一步应是回到同一地址的匿名与登录对照,确认响应是否稳定一致,再决定是否继续修改规则。
每次对照至少记录:URL、请求时间、User-Agent、登录状态、HTTP状态码、Content-Length、ETag、Vary、正文中与规则相关的行。这样做的结果是,当后续再出现设备或登录状态差异时,你能直接判断是新分流、缓存漂移还是规则改动,而不是重新从零猜测。对照记录本身不承诺收录或排名,只用于让决策有据可查。