301重定向的日志核对,核心是确认三件事:请求是否真的返回了301、Location是否指向预期目标、以及客户端和爬虫最终落在哪个URL。最需要优先核对的字段是状态码、Location响应头、请求URL、User-Agent和时间戳。缺少其中任何一项,都可能把“配置正确但日志没记录”误判成“重定向失效”。
日志里第一个要确认的字段是HTTP状态码。301表示永久重定向,302表示临时重定向,200表示请求直接返回了内容,404表示目标不存在。如果日志中大量出现200而不是301,说明重定向规则可能没有命中,请求被直接处理了。
核对时不要只看单条记录。建议按请求URL分组统计状态码分布,重点观察三类情况:
不同服务器的日志格式并不统一。Nginx访问日志通常把状态码放在请求行之后的独立字段,Apache的combined格式也包含状态码,但字段位置不同。判断依据是日志格式定义,而不是凭字段顺序猜。
301重定向的关键不只是“返回了301”,而是Location响应头指向哪里。这个字段在访问日志中不一定默认记录,很多服务器需要额外配置才能输出响应头。如果日志里没有Location,单看状态码无法判断跳转目标。
可以实际执行一次请求来核对,例如用命令行工具查看响应头:
curl -I https://example.com/old-page
返回结果中应出现类似HTTP/1.1 301 Moved Permanently和Location: https://example.com/new-page。这里要核对三点:目标URL是否完整、是否使用了正确的协议、是否指向最终可访问的页面。如果Location指向另一个会再次跳转的地址,就形成了重定向链,需要进一步处理。
适用条件是你能直接发起请求。如果只能看离线日志,就必须确认日志格式中是否包含响应头字段;不包含时,状态码之外的判断都不能算已定位。
只看状态码和Location还不够,还要把请求URL、User-Agent和时间戳放在一起看。
请求URL字段用来确认到底是哪个地址触发了重定向。带参数的URL、带尾斜杠的URL和不带尾斜杠的URL,可能命中不同规则。如果日志中同一个路径出现多种写法,需要分别核对,而不是合并成一个结论。
User-Agent字段用来区分普通浏览器请求和搜索引擎爬虫请求。这两类请求可能因为规则条件不同而得到不同结果。例如规则中设置了针对特定爬虫的例外,普通用户看到301,爬虫却可能看到200。核对时应按User-Agent分组统计,而不是只看总量。
时间戳字段用于判断重定向是何时生效的。修改规则后,旧日志仍然保留修改前的状态。把时间戳和规则上线时间对照,才能判断某条异常记录是历史遗留还是当前问题。
第一次接触这个问题,可以按以下顺序执行:
复查阶段要注意一个常见混淆:robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录。301重定向解决的是URL地址迁移和权重传递问题,不能替代索引管理手段。如果目标是让旧URL从搜索结果中消失,需要单独评估。
建议为每个需要重定向的URL建立一行核对记录,包含请求URL、期望状态码、实际状态码、实际Location、核对时间和核对人。下次出现异常时,直接对比期望值和实际值,就能快速判断是规则问题、目标问题还是日志记录问题。先从当前流量最高的一个旧URL开始,完成一次完整的观察、判断、处理和复查闭环。