问题出现得很突然,日志倒是留得挺全。站点把文章改成了 /a/123.html 的伪静态,日志里同一篇文章却同时出现 .html 和 .php 两个地址,两者都返回 200,收录里两份都在。
刚开始盯着「CDN 对 .php 和 .html 分别缓存,回源各算一次」,折腾了半个多小时,排掉了。
排查方向其实有限,先把可能性排一排。rewrite 用了内部重写,浏览器地址不变但日志记了两次。还有一种是老模板里还有 index.php?p=123 的链接没清理。
不容易想到的是,sitemap 生成时混用了两套地址规则。
上来先按后缀统计同一篇文章的请求
awk '{print $7}' access.log | grep -E '123(\.html|\.php)' | sort | uniq -c
再往下检查伪静态规则是重写还是跳转
nginx -T | grep -A3 'location /a/'
随后把 .php 入口统一 301 到静态地址
rewrite ^/index\.php\?p=(\d+)$ /a/$1.html? permanent;
等前面都确认过,再重新生成 sitemap 只保留一套地址
wp sitemap generate --url=https://www.example.com
改完先别撤,确认这几项。日志里每篇文章只剩一条地址记录,.php 入口全部返回 301,收录中的重复条目在一个月内合并。
提醒一点。内部重写会让一个 URL 产生多条日志,排查重复收录时要先分清是重写还是跳转。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
