先确认一个前提:在 Linux 主机上,/Page-A 与 /page-a 是两个不同资源,返回两个独立状态码;在 Windows 或 macOS 默认文件系统上,它们通常指向同一个文件。当站点从其中一种环境迁移到另一种,或同一批链接由不同工具生成时,就会出现“页面明明存在却报 404”“同一内容出现两条收录记录”这类与直觉相反的结果。统一映射的目标不是消灭大小写,而是让服务器、内链和站点地图对同一个 URL 给出同一个规范形式。
两种条件的处理方式不同,选错方向会白做一轮重定向。
区分方法很简单:对同一路径的两种大小写各发一次请求,记录状态码和最终 URL。若一个 404 一个 200,属于条件一;若都 200 且内容一致,属于条件二。这个动作的结果直接决定下一步是配置重写规则还是补规范标签,两者不能混用。
映射方向必须固定为一个:以服务器上真实存在的文件名为准,把其他写法收敛过去。常见做法是在 Web 服务器层加不区分大小写的路径匹配,或在应用路由层做统一小写化。
假设站点目录里真实文件是 /Products/Detail.html,而历史链接写成 /products/detail.html。可以先用一条规则把所有请求路径转为小写,再交由文件系统匹配;但要注意,如果目录里同时存在仅大小写不同的两个文件,这条规则会把其中一个永远遮蔽。因此实施前先跑一遍清单:列出所有仅大小写不同的路径对,确认没有真实并存的文件,再启用统一转换。
动作与结果的关系:先做路径盘点,若发现并存文件,就先合并或改名,再上规则;若没有并存文件,规则可以直接上线,并用日志观察 404 是否下降。若跳过盘点直接上规则,可能把原本可访问的页面变成 404,问题反而扩大。
当两种写法都能返回 200 时,加 301 重定向是多余的,甚至可能造成循环。正确做法是选定一个规范形式,通常是全小写,然后在三处同时声明:页面 <link rel="canonical"> 指向规范 URL、站内所有链接改用规范形式、站点地图只列规范 URL。
这里要说明一个边界:站点地图只提交规范形式,并不保证收录,它只是把首选版本告诉抓取方;robots.txt 限制抓取也不等于移除索引,被限制的 URL 仍可能以无摘要形式出现在结果里。因此不要用 robots.txt 去“清理”重复的大小写变体,那只会让抓取方看不到规范声明。
验证方式是抽查若干页面,确认规范标签、内链和站点地图三处指向完全一致。若三处不一致,抓取方仍可能自行选择版本,收敛效果打折。
统一映射不是无条件适用的。以下情形需要保留大小写差异:依赖大小写区分资源的 API 路径、带签名参数的下载链接、以及历史上已被外部大量引用且无法批量修改的旧路径。对这类路径,更稳妥的做法是保留原样并单独声明规范,而不是全局转换。
另外,CDN 或反向代理层可能先于源站处理路径,若缓存键区分大小写,同一内容会被缓存两份。排查时要同时看源站和边缘节点的行为,只改源站可能看不到效果。判断依据是:直接请求源站与经过 CDN 请求同一路径,返回的缓存状态是否不同。
请求量或抓取量归零不能单独证明映射做对了,它也可能是抓取节奏调整、站点整体改版或统计口径变化导致的,需要结合状态码分布一起看。把映射方向固定下来,并让三处声明保持一致,才是这类问题可复用的处理方式。