先把当时的情况摆出来。站点去年切到 https,301 已经做了一年,GSC 里 http:// 前缀的页面还有 9000 多条处于已编入索引,抓取统计里 http 地址每天仍被请求两千次。

把日志和配置对完,能解释这个现象的基本就这几处。http 页面返回 301 但没加 rel=canonical 指向 https 版本。也可能是站内还有大量硬编码的 http 内链,蜘蛛顺着旧地址反复抓。

少数情况下是sitemap 里混着少量 http 地址,重新提交时又被带回索引。不容易想到的是,cdn 对 http 的 301 做了长缓存,蜘蛛拿到的跳转目标还是旧值。

上来先抽查 http 地址的跳转与 canonical

curl -sI http://www.example.com/post/1024 | egrep -i 'HTTP/|location'

然后把内链里的 http 全量替换

grep -rl 'http://www.example.com' /var/www/html | head -20

随后清掉 sitemap 里的 http 条目并重交

grep -c 'http://' sitemap.xml

剩下的就是对残留地址做一次批量 301 验证

python check_redirect.py urls_http.txt --expect 301 --to https

怎么算真的好了,看的是同一批现象。http 前缀的索引量从 9000 降到 1200 以内,抓取统计里 http 请求占比从 8% 掉到 1% 以下,sitemap 里不再有旧协议地址。

这里还有个坑。协议迁移不是做完 301 就结束,内链和 sitemap 里的旧写法会持续把蜘蛛带回 http,必须一起清。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189