确认301跳转是否生效,不能只看配置文件里写了什么,而要从客户端实际收到的响应来判断。最直接的方法是用curl -I请求旧地址,观察返回的状态码是否为301,以及Location响应头是否指向预期的新地址。如果状态码是200,说明旧地址仍在直接输出内容;如果是302或307,说明跳转类型不对;如果Location指向错误或缺失,说明规则匹配有问题。
假设团队把http://example.com/old-page迁移到https://example.com/new-page,由A同学在服务器配置里添加跳转规则,B同学负责验收。A同学说“配置已经写好了”,B同学打开浏览器输入旧地址,页面确实跳到了新地址,于是标记完成。但上线一周后发现,旧地址在部分外部链接和搜索引擎抓取中仍返回200,原因是A同学只对带www的域名做了跳转,裸域名没有覆盖。
这个假设例子说明:浏览器能跳转,不等于所有变体都生效。验收必须覆盖协议、主机名、路径、查询参数四个维度,而不是只测一个入口。
命令行工具能拿到浏览器地址栏看不到的响应细节,适合作为交付依据。基本检查项如下:
curl -I http://example.com/old-page:确认状态码是301,而不是200、302、307、308。Location头:值应为目标地址的完整URL,且协议、主机名、路径都正确。http与https、带www与不带www,共四种组合都要测。curl -I "http://example.com/old-page?id=1",确认参数是否按预期保留或丢弃。curl -I -L跟踪完整跳转链,确认没有形成A跳到B、B又跳回A的循环。判断标准很明确:状态码为301、Location指向唯一正确目标、跳转链不超过一跳(除非业务上确实需要多级跳转),三项同时满足才算通过。任何一项不符,都要回到配置层排查。
浏览器开发者工具的Network面板可以看到状态码和响应头,但浏览器会缓存301,测试时容易看到旧结果。建议用无痕窗口,或在Network面板勾选Disable cache。在线HTTP状态检查工具适合快速抽查,但不要把它当作唯一依据,因为不同工具的发请求方式、跟随跳转策略可能不同,结果会有差异。
需要区分的是:浏览器地址栏最终显示新地址,只说明跳转发生了,不能说明状态码一定是301。302、307、JS跳转、meta refresh都能让地址栏变化,但对搜索引擎传递的信号完全不同。所以状态码必须单独确认,不能靠肉眼观察地址栏。
为减少返工,建议把验收标准写成可勾选的清单,随配置一起交付:
curl -I,把状态码和Location值记录在交付文档里。如果站点使用了CDN或反向代理,还要注意跳转可能发生在边缘节点而不是源站。此时源站配置正确,但边缘缓存了旧的200响应,外部访问仍看不到301。排查方法是直接请求源站IP并带上Host头,对比边缘节点的响应,判断差异出在哪一层。
规则写成了302:状态码显示302,跳转本身能用,但不符合永久迁移的语义。路径匹配用了前缀匹配却没排除新地址本身:新地址也被规则命中,形成循环。只配置了带www的跳转:裸域名访问仍返回200。查询参数被规则丢弃:带参数的旧链接跳到新地址后参数消失,可能影响统计或功能。HTTPS证书配置错误:curl报证书错误,跳转在浏览器里可能直接失败而不是跳到新地址。
每种现象都可能有多个原因,比如返回200既可能是跳转规则没匹配上,也可能是规则匹配了但被前面的规则拦截,还可能是CDN缓存了旧响应。不要看到一种现象就断定唯一原因,应按“先看响应、再查配置、最后查缓存层”的顺序逐层缩小范围。
下一步:把上面五项验收清单复制到本次交付文档中,对每个旧地址变体执行一次curl -I,把状态码和Location值填进去,再交给同事复核。这样配置是否生效就不再依赖口头确认。