报错是这么冒出来的。改版把文章地址从 /archives/123 改成 /p/123,301 映射表只写了带日期的旧格式,纯数字的地址全落到 404。三周后索引量掉了六成,外链进来的用户看到的是错误页。
中间走过弯路,把「改版后 sitemap 立即只提交新地址」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。旧地址有两套格式 映射表只覆盖了一套。也可能是301 规则按前缀匹配 没有匹配纯数字路径。
另外,404 页面返回 200 掩盖了问题。
从日志里捞出所有旧格式地址
awk '{print $7}' access.log | grep '^/archives/' | sort -u > old.txt
批量探测旧地址的状态码
while read u; do curl -o /dev/null -s -w '%{http_code} %{url_effective}\n' "https://www.example.com$u"; done < old.txt
补一条覆盖纯数字的跳转规则
rewrite ^/archives/([0-9]+)/?$ /p/$1 permanent;
新旧地址在一段时间内都留在 sitemap 里
curl -s https://www.example.com/sitemap.xml | grep -c '/archives/'
别只看报错消失,验证要多做一步。旧地址全部返回 301 且落到对应新页,索引量在四周内回到改版前八成。
提醒一点。改版前先从日志导出真实地址清单,凭记忆写映射表一定会漏格式。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
