先把当时的情况摆出来。改版后文章地址从 /archives/123 换成 /p/123,正文里的历史内链没有批量替换,三千多条内链全部指向 301,蜘蛛每抓一条都要多跳一次。
真正麻烦的地方在于,几个原因的现象几乎一样。改版只处理了入口跳转,没有回写数据库里的正文链接。还有一种是编辑器里的历史稿件保留了旧地址。
不容易想到的是,模板里的相关推荐读的是旧字段。还有一种情况,301 链本身还叠了协议跳转,变成两跳。
上来先统计正文里指向旧路径的链接数
grep -o 'href="[^"]*/archives/[0-9]*"' posts.sql | wc -l
批量把旧地址替换成新地址
python replace_links.py --from '/archives/(\d+)' --to '/p/\1' --dry-run
随后确认相关推荐模块读的是新字段
grep -rn 'archives/' templates/ | head
等前面都确认过,再抽查一条内链的最终跳转次数
curl -sIL https://www.example.com/p/1024 | grep -c '^HTTP'
怎么算真的好了,看的是同一批现象。正文里不再出现旧路径,单条内链一跳到底,日志中 301 请求占比从三成降到不足百分之二。
容易忽略的是,内链是最容易被改版漏掉的部分,改完地址要把数据库和模板一起扫一遍,别只改导航。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
