核心做法是把开关状态当成页面版本的一部分来记录:每次开关变更,都要留下“开关名、取值、生效时间、受影响URL、当时返回的状态码”这五项,并与死链清单分开存放。否则你看到的404可能来自旧版本,而当前版本其实正常。
功能开关引起的变化通常落在两种情形,处理选择完全不同。
区分依据很简单:把开关关掉后重新请求同一个 URL,如果响应体变了但状态码没变,属于情形一;如果某些 URL 不再被任何页面引用,属于情形二。两者的记录字段不同,混在一起会导致后续复查时无法还原现场。
为每个受控 URL 建一条版本行,字段包括开关标识、取值、抓取时间、HTTP 状态、内容长度区间、页面标题是否存在。动作上,在关闭开关前后各抓一次同一批 URL,把两次结果并排保存。
这样做的直接结果是:当监控报出某 URL 返回 404 或空内容时,你能立刻判断它是开关关闭造成的预期变化,还是真正的死链。如果属于前者,下一步不是删链接或加跳转,而是确认开关是否应该长期关闭;如果开关只是临时灰度,就不该把它写进死链处理清单。
记录重点转向链接来源。为每个开关维护一份“开启时输出的链接集合”,并在关闭后重新抓取同一批页面,对比集合差异。动作上,把差异链接标记为“来源消失”,而不是“目标失效”。
这个区分会改变下一步:来源消失的链接通常不需要 301,因为目标页可能仍被其他入口引用;只有当目标页同时失去所有入口且无外部链接时,才考虑合并或重定向。若直接按死链处理,可能把仍然有效的页面误删。
假设某列表页由开关 list_v2 控制,关闭时改用旧模板。开启时输出 20 条链接,关闭时输出 8 条。记录可以写成:
list_v2=on,抓取时间 T1,链接数 20,其中 12 条仅在此版本出现。list_v2=off,抓取时间 T2,链接数 8,上述 12 条不在任何页面被引用。据此可以判断:这 12 条链接的消失是开关取值导致的,不是页面被删除。若之后监控显示它们返回 404,应先核对开关状态,再决定是否处理。这个例子是假设的比较方法,不代表任何具体站点的实际数据。
有几类情况会让上面的记录失真,需要单独标注。
把这些例外写进同一份版本记录,复查时才能区分“开关导致的预期变化”和“真正需要处理的死链”。记录完成后,下一步动作应基于版本行做筛选:属于预期变化的从死链清单移除,属于来源消失的转入链接审计,只有既无开关解释又无来源解释的 URL,才进入常规的跳转或下线流程。