先给有条件的结论:如果发布后配置短暂生效、随后又回到旧值,最可能的来源是发布链路中某个环节仍在用旧配置渲染或回写,而不是百度爬虫主动改写。要验证这一点,需要把“谁在什么时候写了这份配置”变成可核对的记录,而不是只看线上最终结果。反例是:如果旧值与新值只差一条缓存过期时间,且所有写入日志都显示新值已落盘,那么问题可能在读取侧缓存,而非覆盖写入。
覆盖回旧值有两种成立条件。第一种是写入侧:发布系统、模板渲染或配置同步任务把旧文件重新写回目标位置,此时磁盘上的内容确实变回旧值。第二种是读取侧:磁盘上是新值,但某个缓存层、CDN 或应用进程仍返回旧内容。区分方法很直接——在覆盖发生后立刻读取目标文件本身,再对比通过 HTTP 请求取回的内容。如果文件是新值而请求返回旧值,问题在读取侧;如果文件本身就是旧值,问题在写入侧。
这个判断会直接影响下一步:读取侧要查缓存刷新与进程重载,写入侧要查发布流程和同步任务。两者混在一起排查,容易把缓存过期误判成配置被改。
不要只看最终状态,要建立一条带时间戳的写入记录。具体动作是:在配置目标路径上启用文件修改时间记录,或在发布脚本的关键节点输出写入前后的内容摘要与时间。这样当旧值再次出现时,你能回答三个问题——它出现在哪次发布之后、距离发布多久、期间是否还有其他任务运行。
如果旧值总是在某个定时任务执行后出现,嫌疑就集中到该任务;如果它只在特定发布分支出现,嫌疑在分支对应的模板或配置源。没有这条时间线,你只能反复重启和猜测,无法把“可能原因”收敛为“可验证原因”。
这些原因可能同时存在。比如一次发布失败触发了自动回滚,回滚又把旧值写回,看起来像“发布系统覆盖”。要区分,需要看回滚日志是否存在,以及覆盖时间点是否与失败事件对齐。
假设某站点在发布后,robots.txt 中的抓取限制规则被改回旧版本。先记录当前文件内容与修改时间,然后手动写入新值并记录时间。接下来不再发布,只观察一段时间:如果旧值没有回来,说明覆盖由发布链路触发;如果旧值仍然回来,说明还有独立的定时任务或同步机制在写入。
这个实验的价值在于把“发布”这个变量暂时移除。它不能证明发布系统一定是元凶,但能排除或确认发布链路是否是必要条件。若旧值在无发布时也回来,下一步就应转向定时任务和同步任务,而不是继续修改发布脚本。
在动手修改发布系统之前,先做一件低成本的事:把配置文件的写入来源、写入时间和写入前后摘要记录下来,并保留至少一个完整覆盖周期。这个动作的结果会告诉你覆盖是周期性的还是事件性的。周期性指向定时任务或同步,事件性指向发布或回滚。
只有当日志能稳定复现“谁在何时写了旧值”,修改才有明确目标。否则即使暂时改对,也可能在下一次发布或同步后再次被覆盖。需要提醒的是,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录;追踪配置覆盖的目标是让线上行为可控,而不是替代收录与索引层面的判断。