这类问题我又碰上了一次。WordPress 6.6 的搜索地址保留原始大小写,用户搜 SEO 和 seo 会生成两条 URL,内容一模一样。日志里两种写法都在被抓,Search Console 重复网页报告里成对出现。试过在 robots 里屏蔽 ?s=,收录没降。

第一反应是「站内链接和外部引用的大小写混用,两个版本都有入口」,验证下来不成立。

原因不止一个,得分开看。URL 路径区分大小写,数据库查询却不区分,结果页内容相同;搜索页 canonical 直接输出当前地址,没有统一成小写;页面缓存按原始 URL 做键,两份 HTML 各自被缓存。

第一件事是验证两个地址的内容是否一致

curl -s "https://www.example.com/?s=SEO" | md5sum; curl -s "https://www.example.com/?s=seo" | md5sum

接着把大写参数 301 到小写

if ($arg_s ~ [A-Z]) { return 301 https://$host/?s=$lowercase_s; }

canonical 统一输出小写

add_filter('wp_robots', function($r){ return $r; });

剩下的就是统计两种写法的请求量

grep -o 's=[A-Za-z0-9]*' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head

怎么算真的好了,看的是同一批现象。大写参数全部 301 到小写版本后,重复网页报告里的成对条目消失,搜索页的抓取量减少了一半。

把参数统一小写只是收口的第一步,搜索页本身仍要 noindex,否则换个词又是一批新 URL。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189