先别把“新异常”当成修复失败。更常见的情况是:你动了一个被多处复用的环节,旧问题被压下去,另一条依赖它的路径被顶上来。拆依赖链的目标不是一次改全站,而是找出“谁依赖谁、哪条依赖可以单独断开、断开后先看什么信号”,再决定是否扩大处理范围。
拿你手里一个具体页面做对象,比如某个栏目页或商品详情页。不要先看全站报表,先把与它直接相关的节点列出来:
画完后你会看到两种依赖:内容依赖(锚文本和落点由编辑决定)与结构依赖(链接由模板、分类或参数自动生成)。修复旧问题时如果只改了内容依赖,结构依赖还在,新异常往往就出在结构依赖那一层。此时可执行的动作是:先只断开一条结构依赖,观察该页面及其上游页面的抓取与点击信号是否变化,再决定是否继续断第二条。断开一条后若上游页面出现新的孤立感,说明这条依赖不能单独移除,需要先补替代路径。
删除链接最容易引发另一类异常,因为原本靠它传递的路径突然消失。更稳的做法是做最小替换:把一条自动生成的链接换成一条手工链接,或把全站模板链接收窄到只对特定栏目生效。假设某站点把侧栏“相关文章”模块从全站调用改为仅文章页调用,旧问题是重复链接过多,新异常可能是栏目页失去向详情页的入口。这个例子的数字只用于说明比较方法:改动前记录该栏目页被链入的节点数,改动后只对比同一批节点,而不是直接看全站总量。
替换后要看的信号分两类。一类是抓取路径信号:目标页是否仍能从至少两个不同层级到达。另一类是使用信号:该入口是否承担了用户继续浏览的主要动作。两类信号指向不同结论:前者异常说明结构依赖没补上,后者异常说明内容依赖被误伤。下一步动作据此分开,而不是把两类问题混在一次回滚里。
修复后请求量、抓取量或某个统计归零,不能单独证明处理正确。它还有几种合理解释:目标页被合并、模板缓存未刷新、参数规则把链接判为同一类、或上游页面本身减少了更新。要拆开依赖链,至少同时看三组证据:
第三组最关键。如果异常同时出现在不依赖该节点的页面上,说明问题不在你断开的这条链,继续拆只会扩大影响面。此时应停止改动,回到发布记录里找同一时间窗内的其他变更。
个别样本成立,不代表可以套到全站。以下边界要先写进处理方案:
一个可执行动作是:先选三到五个与样本结构相近的页面做替换,保留一组结构不同的页面不动作为对照。若相近页面表现一致、不同结构页面表现分化,说明依赖链的边界已经找到,可以按结构类型分批推进;若相近页面也分化,说明样本本身不具备代表性,应回到节点图重新确认依赖关系。这个判断影响的是下一步的批次划分,而不是是否继续修复。
最终方案按依赖层级排列,而不是按问题严重程度排列。先处理只被一个页面依赖的链接,再处理被一个模板依赖的链接,最后才处理跨栏目共用的链接。每一步都保留回退点,并记录该步断开后哪类信号发生变化。这样当另一类异常出现时,你能立刻回答:它是被哪一步带出来的、依赖它的页面有哪些、回退这一步是否会把旧问题带回来。拆依赖链的价值就在这里——让每次改动只影响一条可命名的路径,而不是让整站一起承担一次猜测。