答案取决于开关是否改变了页面的对外身份。如果开关只影响样式或局部模块,记录内容版本就够了;如果它会切换语言、分页、登录态或索引指令,就必须把开关名、取值、生效范围和抓取结果一起留档,否则同一URL在不同时间返回不同内容,事后无法判断某个死链接是真实失效还是开关切换造成的假象。
你可能会遇到这种情况:昨天抓取某个页面返回200,今天同一URL返回404,但代码仓库里没有发布记录。或者反过来,昨天是404,今天变成200,而链接本身没有任何人改动。常规做法是查服务器日志和发布记录,但两者都显示“没有变化”。这时问题往往不在链接本身,而在功能开关。
功能开关的特点是:代码已部署,但行为由配置决定。开关一改,页面可能整段消失、跳转目标变化,或者原本渲染的链接不再输出。抓取工具看到的是结果,看不到开关状态,于是同一URL在不同时间呈现不同结果,形成看似矛盾的记录。
第一种解释:开关只改变页面内容。URL不变,返回码不变,但页面里的链接集合变了。原本存在的入口被开关隐藏,导致下游页面失去内链,逐渐变成事实上的死链接。这种情况下,抓取日志里URL本身仍是200,但链接图谱已经断裂。
第二种解释:开关改变了URL的身份或可达性。比如开关控制某个路由是否注册,关闭时该路径直接返回404;或者开关切换了规范化目标,使同一内容出现在两个URL上。这种情况下,URL本身的返回码会变化,死链接是真实发生的,但根因是配置而非内容。
两种解释的后果不同:第一种是链接发现路径被切断,第二种是URL可达性被切断。混在一起记录,就会得出“链接时好时坏”的错误结论。
要区分它们,需要在每次记录版本状态时,同时保存三样东西:
一个假设的例子:某页面在开关A为开时输出指向详情页的链接,为关时不输出。如果你只记录返回码,两次都是200,看不出差别;如果记录了链接集合,就能看到第二次缺少了详情页入口。此时详情页并未返回404,但它已经失去内链,后续可能被判定为孤立页面。这个结果会直接影响下一步:你需要决定是恢复开关、补一条静态入口,还是把该页面从站点地图中暂时移除。
多数人记录了开关取值,却漏掉了开关的生效范围。同一个开关名,可能只对部分用户、部分路径或部分环境生效。如果抓取请求没有携带相同的上下文,记录下来的取值就无法复现当时的页面状态。
实际动作是:在记录版本状态时,把请求上下文一并写入,例如是否带登录态、命中了哪个环境、是否经过CDN缓存。这样当后续再出现同一URL结果不一致时,你可以先比对上下文,而不是直接判定链接失效。上下文不同,结果不同,说明问题在配置分发,而不在链接本身。
死链接的判定依据是返回码和可达性,开关记录的依据是配置状态。两者应该分开存放,但通过时间戳和URL关联。这样做的结果是:当某个URL被标记为死链接时,你可以回查同一时间点的开关状态,判断它是真实失效还是开关切换的副作用。
如果回查发现开关在抓取前后发生过变更,那么该死链接记录只能作为“待复核”,不能直接进入修复队列。复核动作是:在固定开关取值的前提下重新抓取一次,确认返回码是否稳定。稳定为404,才按真实死链接处理;稳定为200但链接集合缺失,则按内链断裂处理。这一步决定了后续是修链接还是修配置,方向不同,处理成本也不同。
需要提醒的是,robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录。因此即使用开关隐藏了某个页面,也不能仅凭这两项断定它已从索引中消失。版本状态记录的作用是让判断有据可查,而不是替代实际的抓取验证。