早期文章别名带大写,访问 /Guide/Hello 和 /guide/hello 都能打开,后者 301 到前者,canonical 里写的还是大写那条,Search Console 里同一篇文章出现两个地址。乍看像缓存或者权限的锅,追下去往往不是。
wp db query 'SELECT ID, post_name FROM wp_posts WHERE BINARY post_name <> LOWER(post_name);' wp post update 42 --post_name=hello-world curl -sI https://example.com/Guide/Hello | grep -i location
追下去是这么回事:服务器和 WordPress 对路径大小写都不敏感,两条地址都能命中同一篇文章,谁也没被标成唯一。canonical 直接取了当前请求的 permalink,请求是大写就输出大写,等于自己指自己。
碰到「URL 大小写归一」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
具体做法是,把所有别名统一转成小写,先用查询列出含大写的 post_name;加一条规则把大写路径 301 到小写,只匹配含大写字母的请求;canonical 改成固定输出小写版本,别用当前请求地址拼;改完在 Search Console 里对旧地址提交一次移除,再观察收录。
验收就看一点,大写地址返回 301 且 Location 是小写,页面源码里的 canonical 只剩小写一条。
