先给结论:测试工具成功而真实用户失败,通常不是跳转规则本身时好时坏,而是两者请求的路径不同——工具往往只取跳转链的第一跳,或从没有Cookie、没有地区标头、没有Referer的干净请求出发。要复现,先做一件事:用工具记录它实际请求的完整URL和响应头,再拿同一URL在真实浏览器里走一遍,比较两者的请求头差异。差异出现的位置,就是下一步要验证的方向。
这个矛盾现象一般落在两类原因上,且它们的证据完全不同。
解释一:工具命中的是另一条规则。301跳转设置通常不是单条规则,而是按主机名、路径前缀、查询参数、协议版本分层的多条规则。测试工具可能只请求了裸域名,而用户访问的是带www或带尾斜杠的变体,命中了另一条分支。也可能工具跟随了跳转链,最终落到一个能打开的页面,于是显示成功,而用户在第一跳就被送到错误位置。
解释二:规则相同,请求条件不同。同一跳转规则在不同请求下可能表现不一致,常见变量包括Cookie、Accept-Language、地区标头、User-Agent、Referer,以及是否经过CDN或反向代理。工具默认不带这些,用户浏览器默认带。如果规则里含有条件判断,两者就会分叉。
这两类原因的区别在于:前者换一个URL就能复现,后者换一个请求头就能复现。
不需要完整日志权限也能做。按下面顺序执行,每步都会缩小范围。
Location。Location。如果第3步就发现URL不同,问题属于规则差异,下一步应去核对规则匹配条件,而不是继续调请求头。如果第3步URL相同、第4步加某个头后复现,问题属于请求差异,下一步应确认该条件是否本来就该影响跳转——很多情况下它不该,那说明规则写得比预期更宽或更窄。
假设某站把http://example.com/old设为301到https://example.com/new,同时另有一条规则把带?from=ad的请求转到活动页。测试工具请求的是不带参数的地址,得到成功;用户从广告链接进入,带参数,被送到活动页,而活动页已下线,于是失败。此时复现方法是给工具加上?from=ad再请求一次。这个例子只为说明比较方法:变量不同,结果就可能不同,并不代表真实站点的配置。
工具显示跳转正常,只能说明那一组请求条件下服务端返回了预期响应。它不能推出:所有入口都正常;搜索引擎抓取时看到的是同一结果;用户侧网络、DNS或代理没有介入;跳转链在第二跳之后仍然正确。反过来,用户失败也不能直接推出规则配置错误——可能是本地缓存、运营商劫持、或用户设备上的旧HSTS记录。
缺少完整日志时,可执行的最小动作是固定一个URL和一个请求头组合,分别用工具和浏览器各请求一次,把两次的状态码与Location并排记录。这个记录不能证明问题已被修复,但能证明差异存在于哪一层,从而决定下一步是查规则、查缓存,还是查网络链路。
复现成功不等于原因唯一。同一现象可能同时由规则差异和缓存共同造成,尤其在跳转链较长时。建议在复现后做一次反向验证:把怀疑的变量去掉,看失败是否消失。消失说明该变量是必要条件之一;不消失说明还有第二个变量没找到。这个动作比反复刷新页面更能推进定位,也能避免把一次偶然的成功当成修复完成。