现场是这样的。旧栏目跳转到新栏目后,CDN 把这条 301 缓存了一天,蜘蛛连续几个小时拿到的都是跳转,新页面的抓取量一直上不去。
中间走过弯路,把「301 的缓存时间比页面长,跳转链越积越多」当成主因,改完现象没变。
这类报错背后常见的原因有几处,逐个排除就行。CDN 默认缓存 301,忽略源站的缓存头;跳转规则改过一次,边缘还留着旧的跳转目标;回源时 CDN 自己又生成了一次 301。
上来先确认 301 的缓存头
curl -sI https://www.example.com/old/1024 | grep -iE 'cache|age'
源站给 301 加短缓存
add_header Cache-Control "max-age=60" always;
随后清掉这条地址的边缘缓存
curl -X PURGE https://www.example.com/old/1024
末了确认跳转只有一跳
curl -sIL https://www.example.com/old/1024 | grep -E 'HTTP/|location'
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
别只看报错消失,验证要多做一步。清缓存后蜘蛛拿到一跳 301 并很快抓到新页,新页抓取量三天内回升。
补一句。301 不是永久不变,改跳转目标时要把边缘缓存一起清,否则线上还是旧目标。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
