当发布系统把 robots.txt 覆盖回旧值,先不要急着改文件内容,而要先判断这次覆盖是“发布链路重放旧产物”还是“有人手工回滚”。两者的追踪路径不同:前者要定位构建与发布环节,后者要定位权限与操作记录。判断依据是覆盖发生的时间点、文件内容是否与某个历史版本完全一致,以及同一批次是否还有其他静态文件被一起替换。
很多团队看到线上 robots.txt 变旧,第一反应是去改服务器上的文件。但如果发布系统采用“构建产物整体替换”的方式,手工改线上文件会在下一次发布时再次被覆盖,问题反复出现。此时应把注意力从文件转向产物来源。
可以做一个假设例子:假设某次发布后,robots.txt 的 Disallow 行回到了三个月前的写法,而同一目录下的其他静态文件也回到了同一时间点的版本。这种“整批回退”更像构建缓存或发布包指向了旧产物;如果只有 robots.txt 单独变化,其他文件不变,则更可能是有人单独替换了这个文件。
这个判断会直接影响下一步:整批回退应去查构建流水线的缓存键和产物版本号;单独变化应去查文件写入记录和操作日志。
追踪到来源之后,处理方式并不是只有“改回来”一种。是否保留旧值、改写旧值,还是暂时退出发布系统管理,取决于旧值本身是否仍然合理。
这三种选择没有通用最优解。如果发布系统每次都会整体替换静态目录,选择“保留旧值但手工改线上”几乎注定会再次被覆盖。
追踪来源时,最有效的动作是把线上当前内容与几个候选版本做逐行比对,而不是只看修改时间。修改时间可能因为同步、复制或部署而更新,不能单独作为来源证据。
具体可以这样做:先取线上文件内容,再取构建仓库中最近几个提交的版本,以及发布系统保留的历史产物版本。如果线上内容与某个历史产物完全一致,包括空行和注释,那么来源大概率是那个产物被重新发布。如果线上内容与任何仓库版本都不一致,则要考虑是否存在发布系统之外的写入途径。
这个动作的结果会决定下一步:命中某个历史产物,就去查该产物为什么被再次选中;没有命中任何版本,就去查服务器层面的写入来源。
把文件改回正确内容只是第一步。要确认覆盖不再发生,需要让下一次发布经过同样的路径,并观察 robots.txt 是否保持正确。这里要注意,抓取限制的变化不等于索引状态会立刻同步变化,不同搜索引擎对 robots.txt 的读取和缓存行为需要分别核查。
如果下一次发布后文件再次变旧,说明之前的来源判断不完整,应回到构建产物和发布记录继续排查。如果连续几次发布后文件保持正确,才可以认为修复生效。这个验证过程不应该用“线上文件当前是对的”来代替,因为覆盖往往发生在发布动作之后。
与其每次覆盖后重新排查,不如在发布流程中留下可复查的痕迹:记录每次发布使用的产物版本号、robots.txt 的内容摘要,以及发布触发人。这样下次出现覆盖时,可以直接比对摘要,快速定位是哪次发布带入了旧值。
需要说明的是,robots.txt 的抓取限制并不等于可靠的索引移除,站点地图也不保证收录。追踪覆盖来源的目标是让配置回到可控状态,而不是用它来承诺任何抓取或收录结果。把来源查清、把发布路径修好,才是这类问题真正可复用的处理方式。