详情页从 /detail.php?id=1024 改成 /detail/1024/,站内链接都换了,外部论坛里的老链接还带着参数,蜘蛛回访时这批地址全部 404。

把日志和配置对完,能解释这个现象的基本就这几处。旧参数地址没有保留跳转规则;站内正文里手动写的绝对链接没有一起替换;CDN 缓存了改版前的跳转结果。

先用带参数的旧地址复现

curl -sI 'https://www.example.com/detail.php?id=1024' | head -3

再往下加一条参数到路径的 301

rewrite ^/detail\.php\?id=([0-9]+)$ /detail/$1/ permanent;

批量替换正文里的旧地址

UPDATE wp_posts SET post_content = REPLACE(post_content, 'detail.php?id=', 'detail/') WHERE post_status = 'publish';

末了抽查旧链接的最终落地

curl -sL -o /dev/null -w '%{http_code} %{url_effective}\n' 'https://www.example.com/detail.php?id=1024'

隔了一天再看,现象没变,说明不是偶发。

那几天正好在做别的变更,先把时间线对齐才敢动手。

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

恢复的判定其实很直接。规则上线后旧参数地址全部 301 到新路径,两周内外链带来的 404 从每天两百条降到个位数。

这里还有个坑。Nginx 的 rewrite 默认不匹配查询串,写参数跳转要用 if 或 map,不然规则看着对实际不生效。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189