这类问题我又碰上了一次。老站做过两次目录调整,旧地址先 302 到中间页再 302 到新页,一条内容要三次请求才能拿到,日志里 302 的数量是 200 的两倍。
第一反应是「跳转目标本身又带参数,落地地址每次都不一样」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。历史跳转没有合并,A 到 B 到 C 的链条一直留着;中间跳转用了 302,蜘蛛不会把它当成永久替换;CDN 缓存了 302 响应,链条被固化了更久。
先抽查一条旧地址的跳转链
curl -sIL https://www.example.com/old/a.html | grep -E 'HTTP/|location'
然后统计 302 与 200 的比例
awk '{print $9}' access.log | sort | uniq -c | sort -rn | head
随后把多跳合并成一次 301
rewrite ^/old/(.*)$ https://www.example.com/new/$1 permanent;
剩下的就是清掉边缘缓存的跳转响应
curl -X PURGE https://www.example.com/old/a.html
怎么算真的好了,看的是同一批现象。同一条旧地址只跳一次,302 请求量下降八成,正文页拿到的抓取配额明显增加。
补一句。跳转链每多一跳就多消耗一次请求,改版时把规则合并成单跳,比事后清理省事。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
