先给结论:不要反复手改线上文件,而是把每次发布产生的 robots.txt 当成版本化产物来追踪。具体做法是,在发布流水线中固定记录「谁写的、写了什么、什么时候生效」,再对比线上实际返回的内容。这样你才能区分是发布系统缓存了旧文件、配置中心回滚了变量,还是有人手动覆盖。下面用一个假设情境串起整个决策过程。
假设某站点把 robots.txt 交给发布系统生成,内容来自一份配置模板加环境变量。某天运营发现线上 Disallow 行又变回三个月前的旧目录。此时有两种常见做法:一是直接登录服务器手动改回新值,二是先冻结发布、定位覆盖来源再修。两种做法都成立,但适用条件不同。
如果只是单台机器、单次误操作,手动改回能立刻恢复;代价是下次发布可能再次被覆盖,而且你失去了这次覆盖的证据。如果同一现象在多次发布后重复出现,手动改回只会掩盖流程缺陷,应该先追踪来源。判断依据是:这个旧值是否曾在某个历史版本的配置里出现过。若出现过,覆盖多半来自发布系统或配置中心;若从未出现,则更可能是人工编辑或外部同步工具写入。
要定位覆盖来源,需要收集能互相印证的三类证据,而不是只看线上文件本身。
这三类证据要一起看。比如修改时间在发布窗口内、但配置仓库里没有对应旧值提交,说明发布系统可能读取了一份未被版本管理的模板,下一步应检查模板的存放位置,而不是继续改线上文件。
定位到来源后,回滚还是改流程,取决于覆盖是否可复现。
这里有个容易被忽略的点:抓取限制的变更会直接影响爬虫行为,但 robots.txt 被改回旧值不等于页面会立刻被移除或恢复收录。抓取限制与索引移除是两件事,前者只表达抓取意愿,后者需要单独的移除手段。所以修复配置后,不要用「收录有没有变化」来验证修复是否成功,而应核对线上返回内容与配置仓库是否一致。
假设发布流程在部署后增加一步:请求线上 robots.txt,与配置仓库中该环境的目标文件做逐行差异比对,差异非空则告警并暂停发布。第一次运行可能报出差异,因为缓存尚未刷新;此时应等待缓存过期后重试,而不是立即判定发布失败。重试后差异消失,说明覆盖来自缓存时序;若差异持续存在,则回到上一步的元数据与版本记录继续定位。这个动作的价值在于,把「改回旧值」从人工操作变成可重复的检查,后续每次发布都会自动暴露同类问题。
无论走哪条路径,修复后都要确认三件事:一是线上返回内容与配置仓库目标版本一致;二是该环境没有其他写入方,比如独立的同步脚本或运维工具;三是不同抓取方对同一份 robots.txt 的解析可能不同,涉及多抓取方时需要分别核查其实际行为,不能只看一份文件的字面内容。满足这些条件后,再把校验步骤固化进发布流程,才算真正解决了覆盖问题,而不只是这一次改对了值。