先给结论:不要从线上响应倒推是谁改的,而要把“配置从哪里来、谁最后写入、发布时读了哪个版本”三条链路分开记录。若发布系统会覆盖,优先在发布链路加一层来源标记与变更留痕,而不是反复手工修线上文件;否则每次修复都只是暂时压住症状,下一次发布仍会回退。
假设一个情境:站点把旧路径的301规则写进发布仓库的配置模板,同时运维侧还有一份手工维护的跳转表。某次发布后,线上规则回到旧目标。此时有两种解释成立,但处理方式相反。
判断依据是“回退后的内容是否等于某个已知版本的完整快照”。等于,偏向前者;只是部分字段回到旧值,偏向后者。这一步决定你该改发布流程还是改配置合并逻辑,选错会白改一轮。
在配置生成阶段注入一个不参与跳转逻辑的注释字段,例如在生成的规则块前写入来源与时间:
<!-- source: redirect-template build-2024-06-01 -->
这个动作的结果是:回退发生后,你只需看线上文件里这行标记属于哪个构建,就能判断是发布产物覆盖,还是手工表被优先加载。如果标记消失,说明写入方不是发布流程,而是另一条直接改文件的路径,下一步应转向排查谁有写权限、是否有定时任务在重写。
注意,标记只用于追踪来源,不要把它当成生效依据;真正生效的仍是重定向规则本身。
很多团队只记“发布成功”,但成功不等于配置正确。更实用的做法是:发布前后各取一次配置文件的哈希或关键字段快照,连同发布单号一起留存。
这样做的代价是需要额外的比对步骤,收益是回退不再靠人回忆。若发布频率很低,手工比对可以接受;若每天多次发布,应把比对做成发布流水线的一环,否则追踪成本会随频率上升。
如果暂时查不出覆盖来源,一个可执行的动作是临时收紧配置文件的写入权限,只保留发布流程可写,观察下一次发布是否仍回退。
结果有两种:仍回退,说明覆盖来自发布流程内部,应继续查模板与合并顺序;不再回退,说明此前存在发布之外的写入路径,应追查该路径的触发条件。这个动作的价值在于用一次对照缩小范围,而不是继续猜测。它也有代价:收紧权限可能影响正常的紧急手工修复,需要事先约定临时放开的流程。
回退修复后,抓取量或某类请求归零,不能单独证明配置已经稳定。抓取下降也可能来自抓取预算调整、外部链接变化或临时屏蔽。要确认覆盖问题结束,应回到配置来源本身:连续若干次发布后,来源标记与目标地址是否保持一致。只有发布链路稳定,才算真正解决,而不是某次抓取恰好没暴露问题。
如果站点同时依赖站点地图或多套跳转表,还要分别核查它们是否各自被覆盖;不同搜索引擎对重定向与抓取限制的支持情况不同,验证时应分别观察,不要用一套结论套用到全部入口。