先查发布链路,而不是先改 robots.txt。旧值能重新出现,通常意味着发布系统里还有第二份配置源,或者缓存层在回源时拿到了旧版本。追踪顺序应从文件内容指纹开始,向前追到生成、提交、部署和回源四层,直到找到唯一能把旧值重新写回的位置。
直接从源站读取文件,再对比 CDN 边缘节点返回的内容。若源站是新值、边缘是旧值,问题在缓存层;若源站本身就是旧值,问题在发布链路。两种情况的下一步动作完全不同。
常见证据组合:源站返回新值且带正确时间戳,边缘节点仍返回旧值,说明缓存层没有按预期回源;源站和边缘都返回旧值,说明旧值已经被写回源站,缓存只是忠实呈现。前者处理缓存刷新,后者必须回到发布系统排查。
这里有一个容易被忽略的条件:抓取工具看到旧值不等于搜索引擎索引里仍是旧规则。robots.txt 的抓取限制和索引移除是两件事,旧文件被重新发布也不代表已经收录的页面会立刻按新规则变化。追踪来源时不要把这个现象当成发布系统的问题证据。
第一种解释是发布管道里存在后置覆盖步骤。比如构建阶段生成新文件,部署阶段又用一份基线模板或快照覆盖它。第二种解释是配置源分裂:旧值来自另一个仓库、另一个环境变量或另一套发布通道,两个源都在写同一个路径,谁最后执行谁生效。
区分两者的关键证据是写入时间与写入者。查看文件修改时间、部署记录和提交历史,如果每次覆盖都发生在同一个部署步骤之后,且时间点固定,更指向固定覆盖步骤。如果覆盖时间不固定,且伴随不同分支或不同环境的发布,更指向配置源分裂。
另一个可区分信号是覆盖范围。固定覆盖步骤通常只影响 robots.txt 这一个文件,其他静态资源保持正常;配置源分裂往往伴随其他配置文件也被回退,比如站点地图路径、规范化规则或重定向表。检查同批部署中还有哪些文件被改回旧值,能帮助判断是单点覆盖还是整批配置回退。
先给当前期望的 robots.txt 计算一个内容指纹,例如用 sha256sum 得到哈希值,再在每次发布后重新计算并记录。这样不必逐行比对,就能快速判断文件是否被替换。
这个动作的结果会直接决定下一步:哈希不变时,应检查发布任务是否真的包含 robots.txt 的生成与上传;哈希回退时,应检查该提交之后的部署步骤里是否存在覆盖或回滚操作。
很多发布系统在部署失败或部分失败时会执行回滚,把整个目录恢复到上一个成功版本。如果 robots.txt 恰好不在新版本的变更集里,回滚就可能把它带回旧值。这种覆盖不是有人手动改回,而是回滚逻辑的自然结果。
需要核查的具体位置包括:构建产物里是否包含 robots.txt、部署清单是否声明该文件、回滚策略是整目录恢复还是按文件恢复、是否存在环境变量或配置中心在启动时重写该文件。假设某次发布只更新了页面模板,没有更新 robots.txt,而回滚策略是整目录恢复,那么旧 robots.txt 被带回就是可预期的结果。这个例子只用于说明比较方法,不代表任何真实系统行为。
如果确认是回滚导致,下一步应把 robots.txt 纳入每次发布的变更集,或调整回滚策略为按文件恢复,避免无关文件被一并回退。
在找到覆盖来源之前,不要反复手动上传新文件,因为下一次发布仍可能覆盖。更有效的做法是给 robots.txt 增加可追溯信息,例如在注释中写入生成时间、提交号和发布批次。这样每次读取文件时都能判断它来自哪次发布。
同时记录每次发布的输入与输出:输入是哪个提交、哪个配置源,输出是哪个哈希。连续记录几次发布后,如果旧值总在特定步骤后出现,就能锁定唯一来源。若记录显示旧值出现的时间与任何发布步骤都不吻合,应继续检查定时任务、配置同步工具或人工操作记录。
只有在确认覆盖来源并阻断它之后,才考虑回退或重新发布。否则回退只是把旧值再写一遍,无法解决追踪问题。