识别301重定向配置冲突,关键是看同一条请求路径是否被多条规则同时匹配,并且这些规则指向了不同的目标。最常见的误解是:只要在服务器或CDN里加了一条301规则,它就一定生效。实际上,重定向可能来自多个层级,比如CDN边缘规则、Web服务器配置、应用框架路由、CMS插件或域名解析服务。它们按各自顺序执行,一旦同一路径被两条以上规则命中,最终结果可能取决于优先级,而不是你最后添加的那一条。
把可能改写跳转的环节列出来,逐层排查,比直接改规则更可靠:
return 301、Apache的Redirect或RewriteRule。判断顺序的方法是:用curl -I请求目标URL,观察响应头中的Location和状态码。如果返回301但目标不是你配置的地址,说明冲突发生在更靠前的层级,或者有多条规则同时命中。
假设要检查http://example.com/old-page,可以执行:
curl -I -L --max-redirs 5 http://example.com/old-page
参数含义:-I只取响应头,-L跟随跳转,--max-redirs 5限制最多跟五跳。输出中每一段HTTP/1.1 301或302都代表一次跳转。重点看:
Location指向的地址是否与你的预期一致。如果第一跳的目标就错了,问题多半在CDN或服务器最外层;如果第一跳正确、第二跳才出错,冲突可能来自应用或插件。
下面几种情况最容易造成规则互相打架:
http://跳到https://,另一条把旧路径跳到新路径。如果顺序不对,可能先跳HTTPS首页,再丢失原路径。判断方法是直接请求http://版本的旧路径,看最终落点是否保留目标路径。/old跳到/new/,同时服务器又强制给所有目录加尾斜杠,可能产生两次跳转。检查时对比带斜杠和不带斜杠两个版本的响应。/blog/*的301可能把本应单独处理的/blog/old-post也吞掉。判断依据是:具体路径的Location是否变成了通配目标,而不是你为它单独设置的目标。不要一次性删除所有规则。更稳妥的做法是:先备份当前配置,再按层级逐条禁用或注释,每改一次就用curl -I复测同一URL。当跳转链从多跳变为一跳、且目标与预期一致时,说明刚禁用的那条就是冲突源。
适用条件是:你能接触到服务器配置或CDN后台。如果只有CMS后台权限,就先在插件设置里查找重复的重定向条目,并检查是否与服务器已有规则目标一致。判断结果是:同一路径只剩一条301,且Location稳定指向最终目标,不再经过中间地址。
下一步,选一个你怀疑冲突的旧URL,执行一次curl -I -L,把每一跳的状态码和目标地址记下来,再对照各层规则找出重复匹配的那一条。