先别急着判定链接已死。测试工具能访问而真实用户失败,最常见的原因是两者并不在同一条网络路径、同一份DNS解析结果或同一套登录状态上。复现的关键不是反复点工具按钮,而是把“谁在什么条件下访问”拆成可替换的变量:来源IP与出口区域、解析到的目标IP、请求头与Cookie、协议与端口、跳转链路。只有让工具侧的请求条件尽量贴近失败用户,死链查询的结论才可信。
两类证据能快速分开“链接真坏了”和“只是你这边通”。第一类是失败用户提供的可观察信息:浏览器报错类型、是否只在某个网络下失败、是否登录后才失败、失败发生在点击后还是跳转后。第二类是同一URL在不同环境下的响应差异:状态码、最终落地URL、响应时间、是否被重定向到登录页或地区页。
如果工具返回200,而用户在特定运营商网络下超时,问题更可能在DNS解析或中间节点,而不是源站资源本身。反过来,如果工具和用户都拿到200,但用户看到的是错误页内容,那要怀疑跳转到了软404或占位页,此时死链查询要查的是跳转终点,而不是起始URL。
此时优先复现解析与出口路径。做法是用同一域名在失败用户所在网络解析一次,记录返回的IP;再用测试工具指定同一出口区域或同一解析结果发起请求。若指定IP后失败复现,而默认解析成功,说明问题在DNS调度或某个节点,而不是页面本身。
这一步的实际动作是固定解析目标再测。结果会直接决定下一步:如果固定到某个IP就复现失败,接下来应检查该节点的证书、端口和回源配置;如果换任何IP都成功,则要把排查方向转到用户本地网络或中间代理。不要因为一次解析失败就断定域名整体有问题,DNS缓存、递归解析器和地区调度都可能造成单次差异。
这类失败往往被匿名工具掩盖。做法是把失败用户的Cookie、Referer、User-Agent和必要的鉴权头,在获得授权的前提下带入测试请求。若带登录态后返回403、302到登录页或空内容,而匿名请求返回200,说明链接对已登录用户不可用,死链查询的判定必须基于真实会话。
实际动作是先复制一份匿名结果作为基线,再逐项加入请求头。哪一项加入后状态改变,哪一项就是变量。若加入Cookie后失败,下一步应检查会话是否过期、权限是否变更、后端是否按角色返回不同内容;若加入Referer后失败,则要查防盗链或来源校验规则。这里要注意,工具显示200不代表用户能看到有效内容,软404和登录跳转都会伪装成成功。
逐项排除时,每次只改一个变量并记录前后状态。这样得到的差异才是可复查的证据,而不是一堆互相矛盾的截图。
假设某旧活动页在工具中返回200,但有用户反馈点击后看到“页面不存在”。把工具设置为跟随跳转并记录最终URL,发现它最终落到一个通用占位页而非活动内容。此时死链查询的对象应从原始URL改为跳转终点,并检查跳转规则是否指向了已下线的模板。这个例子只说明比较方法:状态码相同不代表落地内容相同,必须看最终URL和页面特征。
如果确认终点已失效,下一步是决定保留还是退出。仍有流量的旧链接可以改为指向替代内容并保留跳转;没有保留价值的则应返回410或301到最相关的新页面,而不是统一跳首页。选择依据是用户意图是否还能被满足,而不是链接数量多少。
复现成功后,把条件写成可重复的步骤:出口区域、解析IP、请求头、是否跟随跳转、观察到的状态码与最终URL。交给开发或运维时,这份记录比“链接打不开”有效得多。对方修复后,用同一组条件重测,确认失败不再出现,再扩大到其他网络和会话条件。
需要提醒的是,robots.txt限制抓取不等于可靠的索引移除,站点地图也不保证收录;如果排查涉及搜索引擎表现,应分别核查不同搜索引擎的支持情况。复现条件的目的始终是让判断有据可依,而不是用一次成功请求否定所有用户失败。