先给结论:当测试工具显示可访问、真实用户却失败时,不要急着改死链规则,而要把“工具成功”拆成可复现的条件——来源IP、User-Agent、请求方法、是否跟随重定向、是否带Cookie或登录态、解析到的节点。多数差异来自这些条件不同,而非死链处理本身失效。下面用一个假设情境把决策过程走完。
假设某站点把一批旧URL统一做了301跳转到新路径,运维用脚本批量请求,返回全部是200,于是判定处理完成。上线后客服收到少量反馈:从站内旧链接点进去停在报错页。此时若直接回退跳转规则,可能把已经正常的多数路径一起弄坏。更稳的做法是先复现“用户失败”的最小条件。
复现的第一步不是换工具,而是换身份。工具的请求通常无Cookie、固定User-Agent、直连源站;用户请求带浏览器标识、可能带登录态、可能经过CDN或负载均衡。把这三项逐一改成用户侧条件,观察哪一项改变后结果翻转。翻转的那一项,就是真正的分界线。
两种失败在日志里长得完全不同,处理动作也相反:
判断依据是源站访问日志与CDN日志的时间戳能否对上。如果工具请求能在源站日志里找到、用户请求找不到,问题在链路前置环节;如果两者都能找到但状态码不同,问题在服务端按条件分支的逻辑。
把可疑变量列成一张对照表,每次只改一项,记录状态码和最终落地URL。假设情境中的矩阵可以这样设计:
若第2步翻转,说明服务端按User-Agent做了分支,死链规则只覆盖了默认分支;若第4步翻转,说明多节点配置不一致,需要逐节点核对而不是改规则本身。这个动作的价值在于:它把“要不要回退”变成“改哪一层”,避免整批回退带来的连带影响。
个别样本成立不代表可以照搬。样本量小的时候,你验证的往往只是单节点、单身份、单方法;规模化后请求会分散到多节点、多身份,例外才暴露出来。可用的边界判断是:
还要注意:抓取量或某类请求量归零,并不能单独证明处理正确——它也可能是工具换了出口、日志采样变化或缓存命中导致的。把归零当作唯一证据,容易把“没被请求到”误判成“已经处理干净”。
复现完成后,把分界条件固化进验证步骤:以后每次改死链规则,都用带用户身份的请求跑一遍关键路径,而不是只跑无状态脚本。这样下一次“工具能访问、用户失败”出现时,你能直接对照已知条件定位,而不是从头排查。回退应当是最后手段,且只回退翻转条件对应的那一层。