先给结论:不要直接比较“浏览器看到的页面”和“curl 拿到的文件”。正确做法是把 robots.txt 的静态响应、脚本渲染后的响应、以及实际抓取路径三者分开记录,再判断差异是来自规则本身、响应头与状态码、渲染时机,还是请求路径不同。若差异只在个别样本成立,先保留原规则并加观测,不要急着改写或删除。
robots.txt 是纯文本协议文件,正常情况下不应依赖 JavaScript 才能读出规则。当静态响应与脚本渲染结果不同,常见原因有三类:一是服务器对同一路径返回了不同状态码或不同正文;二是脚本在客户端追加、替换了规则内容;三是请求路径本身不同,例如带与不带查询串、不同子域、不同协议。定位时先固定一个变量:同一路径、同一方法、同一请求头,分别记录静态响应和渲染后的文本。
一个可执行动作是:用命令行保存静态响应,再用无头浏览器或渲染服务保存渲染后的文本,逐行对比。结果会直接影响下一步——如果静态响应里规则完整、渲染后反而多出或少了规则,问题多半在脚本注入;如果静态响应本身就是 404 或 5xx,那么渲染结果再正常也不能作为判断依据。
面对差异,先别默认“渲染后的才是真的”。搜索引擎抓取 robots.txt 时通常按静态响应处理,不保证执行页面脚本。因此取舍要按证据分情况:
这三条不是并列推荐,而是按证据递进。只有先证明差异来源,才能决定保留还是改写;退出是当前两者都无法满足稳定输出时的选择。
不要只凭“看起来不一样”就下判断。下面这组检查能帮你区分原因,且每一步的结果都会改变下一步:
假设一个例子:某站点在静态响应中 robots.txt 只有两行 Disallow,而渲染后出现五条规则。若差异行全部是“新增”,且新增规则来自页面脚本,那么可以判断脚本在客户端追加了规则。此时若直接照搬渲染结果去改静态文件,可能把只在特定条件下才应生效的规则固化,影响其他路径。这个例子只用于说明比较方法,不是真实项目结论。
个别样本成立不代表可以全站照搬。规模化后出现例外,通常是因为样本没有覆盖以下边界:
这些边界说明:当差异只在个别样本成立时,优先扩大样本覆盖,而不是修改规则。可以把差异样本按子域、目录、缓存节点分组,观察例外是否集中在某一组。若例外集中在缓存节点,处理方向是刷新缓存并复验静态响应;若集中在某一目录,才需要检查该目录的规则生成逻辑。
修复后不要只确认“渲染结果正常”。应回到静态响应:状态码为 200、正文可解析、规则与预期一致,并且在不同请求路径下稳定。抓取限制不等于可靠的索引移除,robots.txt 的 Disallow 只约束抓取,不保证页面从索引中消失;站点地图也不保证收录。若你的目标是移除索引,需要另外的机制,不能把 robots.txt 当作唯一手段。
另外,请求量或抓取量归零不能单独证明处理正确。它也可能是抓取预算调整、缓存命中、路径本身无入口等合理解释。判断修复是否生效,应结合静态响应的稳定性、规则命中的路径范围,以及后续抓取记录是否与预期一致。不同搜索引擎对 robots.txt 的支持细节须分别核查,不要用单一来源的结论覆盖全部。
最后给出一个可执行顺序:先固定请求条件记录静态响应,再记录渲染结果并标注差异类型,然后按路径分组扩大样本,最后才决定保留、改写或退出。每一步的结果都应改变你对下一步的判断,而不是先改规则再找理由。