最可靠的做法是:把测试环境当作“规则验证场”,把线上当作“结果验证场”。先在测试环境确认重定向规则本身正确,再在线上用同样的请求路径复核响应状态码、Location 头和最终落地页。两边都通过,才算交付完成;只在一侧通过,就不能合并或上线。
测试环境和线上的差别不只是域名。测试环境通常有访问限制、缓存策略不同、CDN 未接入,线上则可能经过负载均衡、CDN、WAF 等多层处理。因此对照的重点不是“两边页面长得一样”,而是同一组旧 URL 在两边的响应行为是否一致。
多人协作时返工最多的原因,是每个人随手挑几个链接测,结论无法对齐。建议先产出一份固定的对照清单,两边跑同一份。
清单里要覆盖边界情况:带尾斜杠与不带尾斜杠、带查询参数、大小写不同的路径、已不存在的深层页面。这些往往才是规则写错的地方。
浏览器会自动跟随跳转,地址栏显示的是最终页面,中间的 301 可能被隐藏。判断依据应该是响应头。用命令行请求时只看第一跳:
curl -I https://example.com/old-page
重点看三处:状态码是否为 301;Location 是否指向预期目标;跳转是否只发生一次。如果返回 302、307 或 200,说明规则没生效或被其他规则覆盖。如果连续多次 301 才到终点,属于跳转链,应尽量压缩为一跳。
测试环境如果加了访问认证,curl 可能先拿到登录页而不是重定向结果,这时需要带上访问凭据,或临时对测试请求放行,否则测出来的状态码没有参考价值。
同一份规则在测试环境通过、线上不通过,可能原因有几类,需要逐项排查,不要直接断定是某一层的问题。
定位方法是从最靠近源站的一层开始,逐层向外请求,看状态码在哪一层发生变化。已经定位到的原因和“可能原因”要分开记录,避免把猜测当成结论写进交付文档。
规则合并到线上后,不要只看首页。按对照清单再跑一遍全量或抽样,确认每条旧 URL 都返回预期状态码并落到正确页面。同时检查反向情况:原本正常的页面是否被误跳转。
如果旧 URL 数量大,可以写一个简单脚本批量请求并输出状态码与 Location,再和清单比对。这类脚本只做检查,不修改线上配置。复查通过后,把对照表、实际结果和未解决项一起归档,作为本次交付的凭据。
下一步:拿一份现有的旧 URL 清单,在测试环境和线上各跑一遍,把不一致的行单独列出来,先修规则再重新对照。