先给结论:不要用“换台设备再打开一次”来判断 robots.txt 是否真的不同。同一地址返回不同内容,通常来自三条互不相同的链路——请求是否带 Cookie、是否命中 CDN 或反向代理的缓存、以及服务端是否按 User-Agent 或来源 IP 做了分流。对照的正确做法是固定其中两条、只放开一条,并把每次响应的状态码、正文和响应头一起留证。下面用一个假设情境把决策过程走完。
假设某站点把 robots.txt 放在 /robots.txt,运营人员用手机浏览器访问,看到的是允许抓取的版本;但在服务器上执行抓取命令,拿到的却是 403。此时最容易得出的结论是“搜索引擎被针对了”,但这个结论缺少证据。更合理的起点是:这两次请求在 Cookie、User-Agent、来源 IP 和缓存命中状态上至少有一项不同,需要逐一排除。
先记录两条基线。第一条是手机浏览器的完整请求与响应:URL、请求头里的 Cookie 与 User-Agent、响应状态码、响应头中的 Cache-Control、Vary、Set-Cookie、以及正文首行。第二条是服务器侧抓取的同样字段。把两份记录并排放,差异点就是下一步要验证的对象,而不是直接下判断。
登录状态返回不同内容,最常见的原因是服务端对已登录会话做了差异化输出,或者中间层对带 Cookie 的请求绕过了缓存。判断方法不是“退出登录再看”,而是构造两次只差 Cookie 的请求:
如果 A 与 B 的状态码或正文不同,说明分流与登录态有关。此时要问的是:这种差异是否会影响抓取工具。抓取工具通常不带会话 Cookie,所以应以 A 的结果为准来判断它对 robots.txt 的读取。反过来,如果 A 与 B 相同,Cookie 就可以从嫌疑名单里划掉,把注意力转向缓存和 User-Agent。
这里有一个容易忽略的动作:在响应头里查 Vary。如果 Vary 包含 Cookie,说明缓存层已经声明会按 Cookie 区分版本,那么不同设备看到不同内容属于设计内行为;如果 Vary 不含 Cookie 却仍然出现差异,就更可能是缓存配置或服务端逻辑不一致,需要继续查。
同一地址在不同设备上返回不同正文,另一种常见解释是 CDN 或反向代理缓存了不同版本。判断依据是响应头里的年龄字段、缓存状态字段和 X-Cache 一类自定义头,而不是正文本身。可以这样操作:
这个动作的结果会直接改变下一步:若差异由缓存造成,要处理的是缓存键与刷新策略;若绕过缓存后仍然不同,才需要回到源站配置里找按设备或按登录态分流的规则。
把上面的观察整理成一张对照表,可以让分歧收敛。下面列出可区分的证据组合,均为方法示例,不代表任何具体站点:
Vary 含 Cookie。三种解释可以同时存在,所以验证顺序建议是:先固定 User-Agent 与来源,再切换 Cookie,最后处理缓存。每验证一项就把它从变量里移除,剩下的差异才值得继续追。
确认差异来源后,动作取决于它是否影响抓取工具。若差异只出现在带 Cookie 的会话中,而抓取工具不带 Cookie,则 robots.txt 对抓取的实际约束应以无 Cookie 版本为准,需要检查的是无 Cookie 版本是否被正确缓存和分发。若差异来自 User-Agent 分流,则要确认被分流的那个 User-Agent 是否正是目标抓取工具使用的标识,并分别核查不同搜索引擎的支持情况,因为各家的抓取标识与行为并不统一。
还有两点必须同时记住:robots.txt 的抓取限制不等于可靠的索引移除,即使某条路径被禁止抓取,已收录的 URL 仍可能出现在结果中;站点地图也不保证收录。因此,当对照结果显示“抓取工具看到的是禁止版本”时,下一步应核实这是否是预期配置,而不是默认它会自动完成移除。
最后,把每次对照的请求头、响应状态码、响应头和正文摘要按时间顺序存档。请求量或抓取量归零不能单独证明处理正确,它也可能是缓存、网络或统计口径变化造成的;只有可复查的响应记录,才能在下一次出现反常结果时快速定位是哪一条链路发生了变化。