识别301转向配置冲突,最可靠的方法不是盯着某一条规则看,而是把请求实际走过的路径抓出来,再和所有可能改写它的配置逐层对照。只要同一请求被两个以上位置同时处理,例如服务器配置、应用路由、CDN或反向代理各写了一套规则,就可能出现循环跳转、跳转目标被再次改写、http与https来回跳、带www与不带www互跳等冲突。判断标准很简单:一次正常301应该只有一个明确的源地址和一个明确的目标地址,最终返回200,中间不经过多余的3xx。
用命令行工具跟踪完整链路,能直接暴露冲突。以下命令只做检测,不修改配置:
curl -I -L --max-redirs 10 http://example.com/old-page
curl -I -L --max-redirs 10 https://www.example.com/old-page
观察每一跳的Location头和状态码。如果出现以下现象,基本可以判定存在冲突:
注意,curl -I发的是HEAD请求,某些应用只对GET做跳转,这时改用curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" -L逐跳核对更稳妥。不同搜索引擎对跳转链的跟随能力不同,但配置冲突本身与搜索引擎无关,先修配置再谈收录。
冲突往往来自“多处都能做跳转”。按请求进入顺序排查,通常包括:
rewrite、return 301,Apache的Redirect、RewriteRule,是否同时存在泛域名跳转和单路径跳转。<meta http-equiv="refresh">或前端脚本跳转。<link rel="canonical">指向的地址与301目标不一致,会让人误以为跳转没生效。排查时按“先外后内”或“先内后外”固定一个顺序,避免边改边测导致现象漂移。每定位到一条规则,记录它的匹配条件、目标地址、状态码,然后与抓到的跳转链比对。如果某条规则的目标地址又落进另一条规则的匹配范围,就是典型的规则打架。
发现冲突后,通常有两种处理方向,选择依据是冲突规模和可控性。
方案一:收敛到单一入口,只保留一层跳转。适合规则数量少、能明确谁是权威域名的站点。做法是把所有跳转集中到Web服务器或CDN其中一层,其他层只做转发不做改写。适用条件是团队能同时修改并发布这几层配置。验收标准是任意源地址的跳转链长度不超过1,且最终地址唯一。
方案二:分层负责,各管一段。适合大型站点或CDN与源站由不同团队维护的情况。例如CDN只负责http到https,源站只负责旧路径到新路径。适用条件是两层的匹配范围必须互不重叠,且要有明确的交接地址。验收时要专门测试边界情况,比如已经是https的请求不应再被CDN改写,旧路径跳转后不应再触发域名跳转。
如果无法判断该用哪种,先统计冲突请求的占比和涉及路径数量。冲突集中在少数路径,用方案一更快;冲突遍布全站且分层职责清晰,方案二更可持续。两种方案都不保证收录或排名变化,它们只解决跳转行为本身是否正确。
无论选哪种方案,交付结果都应满足以下可核对项:
下一步,选一个当前存在疑问的旧地址,用上面的curl命令抓出完整跳转链,再把链路里出现的每个主机名和路径,回到CDN、服务器、应用三层配置中逐一搜索。找到同时匹配同一请求的两条规则,就是冲突点。