结论先行:当同一批 URL 在不同环节出现大小写差异时,不要急着改服务器配置,先把“谁在写、谁在存、谁在读”三方的路径映射写成一张可核对的对照表,用 301 把非规范大小写统一到规范形式。这个做法成立的前提是:差异确实来自路径大小写,而不是参数、协议或尾斜杠。若服务器或 CDN 对大小写做了不透明归一,结论会失效,因为你在日志里看到的路径可能已经被改写过。
路径大小写在很多系统里默认不敏感,比如部分 Windows 服务器和某些对象存储,/Page/A 与 /page/a 可能指向同一份内容,但在日志或抓取记录里显示成两种写法。这会制造“重复 URL”的假象。
要区分真假,可以做一个核对动作:从站点地图、内链、外链、日志各取若干条含大写字母的路径,逐条用 curl -I 请求原始大小写和全小写两个版本,比较返回的状态码和 Location 头。
这一步的结果直接决定下一步:如果服务器不区分大小写,重点转向统一链接来源;如果区分,就必须建立映射并让所有入口指向同一形式。
多个角色对“哪个路径才是对的”有不同理解时,争论没有意义,需要一张表让分歧变成可核对的项目。表里至少包含四列:来源(谁写的)、原始路径、规范路径、当前响应。
表建好后,任何一方说“这里不对”都可以指向具体行。假设某栏目模板输出 /News/2024/Item,而站点地图写的是 /news/2024/item,表里两行并列,就能看出是模板与站点地图不一致,而不是服务器问题。这个假设只是说明比较方法,不代表真实项目结论。
确认需要归一后,标准动作是把所有非规范大小写 301 到规范形式。301 传递的是“这个地址永久换了”,比 302 更适合路径归一。
这里有两个常见误区需要点明:robots.txt 的抓取限制不等于可靠的索引移除,它只约束抓取,不保证已收录地址消失;站点地图也不保证收录,它只是提交候选地址,不能替代跳转规则。把希望寄托在这两者上,通常不会解决大小写重复的问题。
具体动作示例:在服务器或反向代理层加规则,把已知的大写变体重写到规范小写路径,并返回 301。加完后重新跑一遍前面的 curl -I 核对,确认每个变体都落到同一目标,且没有跳转链。若跳转链超过一层,下一步应先合并规则,而不是继续加新规则。
如果 CDN 或负载均衡在回源前已经把路径统一成小写,那么你在源站日志里看到的“大写路径”可能从未真实到达源站。此时按源站日志建映射表,会把不存在的变体当成问题处理,规则也可能与 CDN 行为冲突。
判断方法:对比 CDN 边缘日志与源站日志中同一条请求的路径写法。若两者大小写不同,说明中间层做了改写。这种情况下,统一映射应放在改写发生的那一层,而不是源站。另一个反例是路径本身对大小写敏感且有业务含义,比如短链或签名路径,强行小写化会导致校验失败,这类路径应排除在归一规则之外。
先完成映射表并标注每行的规范形式,再在改写发生的那一层加 301,最后用原始大小写和规范形式各请求一次,确认状态码与目标一致。验收通过后,把规范形式同步到模板、站点地图和内链规范中,避免新链接再次产生变体。若核对中发现某个变体仍返回 200 而非 301,说明该入口未被规则覆盖,应回到映射表补行,而不是直接扩大规则范围。这样每一步都有可核对的依据,分歧也就变成了可以逐行关闭的清单。