先别回滚,也别继续加补丁。把这次内链修复涉及的对象按“数据来源—生成规则—输出目标—消费方”列成四层,然后从异常出现的那一层往上逐层断开,一次只恢复一层依赖。哪一层断开后异常消失,问题就在那一层与上一层之间,而不是在内链本身。
假设某站要退出一个旧合作关系,把合作方提供的旧内容页从导航和正文里撤掉。编辑把指向这些页面的内链统一改成指向新的聚合页,同时保留了一批仍有价值的旧文章,只在文章顶部加一条跳转提示。上线后出现两类异常:一是部分保留页的正文内链全部失效;二是聚合页开始出现大量重复标题。前者是链接目标问题,后者是数据来源问题,两者被同一次改动绑在了一起。
这就是典型的依赖链耦合:一次操作同时改了“链接指向”和“内容来源”两件事,异常出现后无法判断是哪一层导致的。拆链的第一步不是修,而是把这两件事分开。
把改动拆成四层来看:
判断依据很直接:如果异常只出现在“被撤掉内容的页面”上,问题在数据来源层;如果异常出现在“所有使用同一模板的页面”上,问题在生成规则层;如果只有部分链接失效,问题在输出目标层。三类证据指向不同层,处理顺序也不同。
假设已经确认保留页正文内链失效,同时聚合页重复标题。按以下顺序操作:
每完成一步,记录“断开哪一层—异常是否消失—下一步动哪一层”。这个记录决定后续是继续修还是回滚。如果断开生成规则后异常仍在,就不要继续动生成规则,直接转向数据来源层。
内链修复后,页面能打开、抓取请求量回升、某条统计归零,都不能单独证明依赖链已经拆干净。抓取量回升可能只是爬虫重新访问,不代表链接目标正确;请求量归零可能是监控口径变了,也可能是页面被临时屏蔽。要区分这些解释,至少同时看三组信号:目标页是否返回正常状态、正文内链是否指向预期URL、聚合页标题是否与来源数据一致。
另外,如果改动涉及屏蔽规则,要清楚 robots.txt 的抓取限制不等于可靠的索引移除;站点地图不保证收录。这些手段影响的是抓取和发现,不解决内链目标错误本身。把它们当成依赖链的一环来验证,而不是当成修复动作。
退出旧合作时,保留哪些内容取决于两个条件是否同时成立:该内容仍有独立访问价值,且不依赖旧合作方的数据字段。两个条件都成立,就保留原文并只改内链指向;只满足第一个条件,就把内容迁到新聚合页并保留跳转提示;两个都不成立,就整体退出,不要为了保留而保留。
假设某篇旧文章过去三个月仍有稳定访问,但作者字段和分类字段来自旧合作方。此时应保留文章正文,把作者字段改为站内通用署名,分类字段改为站内分类,而不是继续引用旧字段。这样数据来源层与输出目标层解耦,后续再改内链不会连带影响这篇文章的渲染。
拆依赖链的终点不是让所有异常消失,而是让每一层只依赖它该依赖的东西。做到这一点,下一次改动才不会再次引发另一类异常。