先把“同一地址”拆成两条可复查的请求链:一条用未登录、无历史 Cookie 的会话,另一条用目标设备或目标登录态。分别保存请求头、响应状态、最终跳转地址和响应正文片段,再对照差异。若两条链在状态码或最终地址上就分叉,先按分叉点决定保留、改写还是退出,不要急着做全站重定向。
设备或登录态造成的差异,通常落在三个位置:服务器按 User-Agent 或 Cookie 返回不同状态码;边缘层按设备做跳转;页面本身按登录态渲染不同模板。三者的处理方式完全不同。
判断依据是响应快照里的字段,而不是“手机打开正常、电脑打开异常”这种印象。把两条链的以下字段并排列出:请求方法、User-Agent、Cookie 是否存在、响应状态码、Location 头、最终 URL、正文前若干字符。若状态码一致、最终 URL 一致,只是正文不同,问题在渲染层,属于内容对照;若状态码或 Location 不同,问题在路由或边缘规则,属于死链判定对照。
假设一个场景:未登录请求返回 200 并展示商品页,登录后请求返回 404 并展示空状态页。此时不能因为登录态看到 404 就判定该地址是死链,也不能因为未登录看到 200 就判定它健康。正确动作是确认 404 是服务端真实返回还是前端路由兜底,这决定下一步是修路由还是改内容。
保留的前提是,无论设备或登录态如何,该地址都能返回有意义的内容,且状态码语义一致。适用条件包括:差异只体现在版式、语言或模块显隐;最终 URL 不因设备而改变;不存在一条链返回 404、410 或长时间 5xx。
如果保留,需要做的实际动作是固定一组对照请求并定期重跑,而不是只看一次。把两条链的响应摘要存成文本快照,记录抓取时间。下一次改动模板、登录逻辑或边缘规则后重跑同一组请求,若快照出现分叉,就能定位是哪次改动引入的。这个动作的结果直接决定后续是继续保留还是转入改写。
注意,robots.txt 的抓取限制不等于可靠的索引移除,也不能用它掩盖两条链的状态码差异;站点地图不保证收录,把地址放进站点地图并不能替代对登录态响应的核查。
当设备分流或登录分流是业务有意为之,且旧地址仍应有明确去向时,选择改写而不是直接退出。典型条件是:未登录用户应看到引导页,登录用户应看到功能页;或移动端应进入对应的适配地址。
改写时要区分两件事:服务端返回的状态码,以及页面内是否用脚本再次跳转。若用脚本跳转,对照请求时要关闭脚本执行再跑一遍,否则你看到的是脚本执行后的结果,不是服务器原始响应。这一步的实际影响是:关闭脚本后若返回 200 但正文为空,说明该地址对无脚本环境不可用,改写方案需要补一个服务端可达的落点。
改写完成后,用同一组对照请求复测,确认两条链的最终 URL 都指向预期落点,且没有形成跳转环。若登录态链跳转到登录页而登录页又依赖该地址,就会形成环,此时应退回保留或改为直接退出。
退出的适用前提是:目标地址在至少一条主要访问链上长期返回 404 或 410,且不存在内容等价的替代地址。此时继续保留只会让不同设备或登录态的用户得到互相矛盾的体验。
退出不等于简单删掉。实际动作是先确认该地址是否仍被外部引用,再决定返回 404 还是 410,并把仍有效的引用指向替代地址。这个动作的结果会影响下一步:若替代地址本身也存在设备或登录态分叉,就需要先解决替代地址的对照问题,再处理原地址,否则只是把矛盾转移。
需要说明的是,请求量或抓取量归零不能单独证明退出处理正确,它也可能来自抓取预算变化、外链自然衰减或统计口径调整。判断退出是否合理,仍要回到两条链的状态码与最终地址是否一致。
无论最终选保留、改写还是退出,对照记录至少包含:请求时间、设备标识或登录态标识、请求 URL、响应状态码、Location、最终 URL、正文摘要。用 curl -I 只能看到头部,遇到脚本跳转或前端路由会漏判,因此头部与正文要一起取。
把上述字段固定下来后,同一地址在不同设备或登录态下的表现就不再依赖个人印象,保留、改写或退出的判断也有了可复查的依据。