先把“死链”拆成两个可分别验证的层:网络响应层(状态码、重定向链、最终URL)和内容层(返回的HTML是否包含有效页面主体)。同一地址在手机与桌面、登录与未登录下表现不同,通常不是状态码本身在变,而是内容层发生了替换——例如未登录被跳到登录页、移动端被跳到m站或App引导页、地区或UA触发了不同模板。对照的做法是:固定一个基准环境,采集响应证据,再逐项改变单一变量复测,最后判断这条URL对“目标用户”是否算死链。
选一个你日常使用的浏览器,退出登录或使用无痕窗口,关闭可能改写请求的插件,记录以下四项:请求URL、响应状态码、重定向链(每一跳的Location)、最终渲染后的页面标题与首屏正文片段。命令行可用 curl -I -L 看头部,但头部正常不代表内容可用,所以还要保存一份渲染后的正文文本或截图。这一步的产出是一份“基准样本”,后续所有对照都以它为参照。
如果基准环境本身返回200但正文是“请登录后查看”,那么这条URL对未登录访客已经是事实上的死链,即使服务器没报404。动作与结果的关系在这里很直接:先确定“谁是你认定的有效访问者”,再决定用哪个环境当基准,否则后面的对照会失去判据。
不要一次同时换设备和登录状态,否则无法归因。按下面顺序单独改变,每改一项就重新采集同一组四项证据:
每一项的判定标准是:状态码、最终URL、正文主体三者中,哪个发生了变化。只有状态码变(如200变404)才是典型的链接失效;只有正文变(如200但内容被替换)属于内容层死链;只有最终URL变(如跳到登录页)属于可达性被拦截。
假设某商品详情页 /item/123 在桌面未登录时返回200且正文完整,在手机未登录时返回200但正文是“打开App查看”。这时不能简单判定为死链,而要问:移动端Web是否本来就不提供该内容?如果业务上移动Web应当可读,那这条URL对手机访客就是内容层死链,需要修跳转或补移动模板;如果业务上移动端只引导下载,那么它不算坏链,但不应把它当作可被正常抓取的有效页面提交。这个判断依赖业务前提,而不是状态码本身。
再假设登录后桌面和手机都正常,只有未登录异常。此时更可能是权限或登录墙问题,处理方向是调整访问控制或提供公开摘要,而不是去改链接。把这两种情况混在一起修,往往会改错地方。
对照完成后,按下面条件分流,而不是一律删除或一律保留:
需要提醒的是,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录。因此,即使你通过robots屏蔽了某个异常变体,也不应把它当作已处理完毕的证据;判断是否真正解决,仍要回到“目标访客访问该URL时能否看到预期内容”这个原始判据。
每次修改后,用与基准样本相同的环境、相同的四项证据重新采集一次,并保存修改前后的两份记录。若修改只影响登录态,就重点复测未登录;若只影响移动端,就重点复测手机UA。复测通过的标准是:目标访客在预期环境下能看到预期内容,且状态码与最终URL符合你的设计意图。
如果复测仍出现设备或登录态差异,说明变量没有收敛,应回到上一步继续缩小范围,而不是扩大改动面。把每次对照的证据留档,下一次同类问题出现时,你就能快速判断它是新问题还是旧逻辑的再次触发。