内链里混着 /About、/about 和 /ABOUT 三种写法,服务器全返回 200,日志里同一篇文章一天出现三条不同路径。乍看像缓存或者权限的锅,追下去往往不是。
rewrite ^/About/?$ /about/ permanent; rewrite ^/News/?$ /news/ permanent; # 入口逐个收敛,canonical 只写小写地址
追下去是这么回事:Linux 文件系统区分大小写,静态文件各自独立;程序层的别名查询又会在大小写变体上命中同一篇,两个条件叠加,同一内容就有了多个可访问地址。
「URL 大小写重复」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
具体做法是,先确认服务器是 Linux 还是 Windows,两边表现不一样;把已知的大写入统一 301 到小写地址;模板生成链接时直接转小写,别在输出后补救;canonical 只写小写版本,保持单一信号。
验收就看一点,从外部访问 /About 只跳一次到 /about/,日志里不再出现大写路径返回 200。
