先给结论:服务器文件系统区分大小写时,把页面里的链接统一成实际文件名的大小写,是唯一能同时解决抓取和用户体验的做法;如果站点已经积累了大量错误外链,才需要额外加一层大小写归一化跳转。判断走哪条路,关键看错误是"链接写错"还是"文件被改名"。
常见现象是:本地 Windows 环境访问 /Images/Banner.jpg 正常,上传到 Linux 空间后同一路径返回 404,而写成 /images/banner.jpg 又能打开。这时有两种解释。
Banner.jpg 和 banner.jpg 当作两个不同文件,引用时大小写不一致就会落空。两种解释对应完全不同的处理方式:前者要改链接,后者要确认映射规则是否稳定、是否覆盖全部目录。
不要只看首页能否打开,要构造能暴露差异的对照。假设站点根目录下真实存在 Logo.PNG,可以依次请求:
/Logo.PNG,记录状态码。/logo.png,记录状态码。/LOGO.PNG,记录状态码。如果只有第一种返回 200,说明文件系统敏感,链接必须逐字对齐;如果三种都返回 200 且最终落到同一文件,说明存在归一化映射,但要继续确认这个映射是服务器配置、CDN 规则还是应用路由带来的。判断依据是:换一个未被规则覆盖的目录再测一次,若结果不一致,映射就不可靠。
另一个可区分的证据是日志。若同一资源的 404 集中在特定大小写形式,而其他形式正常,通常指向链接写法问题;若所有大小写形式都间歇性失败,更可能是缓存或映射层不稳定。
做法 A:源头统一,把所有引用改成与实际文件名一致的大小写。 适用条件是站点规模可控、模板集中、错误链接数量有限。代价是需要排查模板、CSS、JS、站点地图和数据库里存的内容字段。动作上,先导出所有被引用的资源路径,与服务器实际文件名做逐条比对,把不一致的改掉;改完后重新抓取受影响页面,确认 404 数量下降,再决定是否继续处理剩余目录。
做法 B:在服务端加大小写归一化规则。 适用条件是外部已经存在大量指向错误大小写的链接,且无法逐一修改来源。代价是规则要覆盖所有目录,否则会出现部分资源能访问、部分不能访问的割裂状态;同时要防止把本就存在的两个不同文件错误地合并成一个。
选择的分界点在于:错误来源是否在你可控范围内。可控就选 A,因为归一化规则会长期增加一层维护负担;不可控才选 B,并且要把它当成过渡手段,而不是永久方案。
如果决定加规则,需要明确它只处理大小写,不改变路径结构。假设把 /Assets/Img/ 统一映射到 /assets/img/,要验证映射后返回的是同一个文件内容,而不是空文件或默认页。可以用一个假设例子说明验证方法:准备两个内容不同、仅大小写不同的测试文件,请求两种形式,若返回内容相同,说明规则把两个文件错误合并了,这时必须回退。
还要注意站点地图和 robots.txt 中的路径写法。robots.txt 的抓取限制不等于可靠的索引移除,路径写错也不会因为限制规则而自动修正;站点地图不保证收录,里面的 URL 大小写与实际不符只会增加无效抓取。归一化规则上线后,观察服务器日志中目标路径的响应分布,若 404 仍集中在旧形式,说明规则未覆盖该目录,下一步应扩大覆盖范围而不是继续改链接。
验证不能只看某个页面能否打开。应分别检查:模板输出的链接、站点地图中的 URL、以及服务器日志里对应资源的响应状态。若三处都指向同一大小写形式,且日志中该资源的 404 消失,才能认为映射生效。若 404 减少但未归零,需排查是否还有数据库存储的旧路径或第三方引用,再决定是否保留归一化规则作为兜底。