先明确一点:路径大小写问题几乎不会只影响一个站点。当同一台服务器上多个站点共享模板、伪静态规则或重写映射时,大小写不一致会随映射关系扩散。要统一映射,关键不是把所有 URL 改成小写,而是先判断“大小写差异发生在哪一层”:是文件系统层、Web 服务器重写层,还是应用路由层。判断错层,改了也不会生效。
统一映射前必须先确认服务器的文件系统行为,因为这决定了映射方向。
/Images/Logo.png 与 /images/logo.png 是两个不同文件。如果模板里写的是大写,而磁盘上实际是小写,请求会直接 404,重写规则再怎么写也救不回来,因为目标文件根本不存在。判断依据很简单:在服务器上对同一路径分别用小写和大写访问一次,看返回的是内容还是 404。如果两者都返回内容,说明文件系统不敏感,问题在更上层;如果只有一种能返回,问题就在文件系统与引用不一致之间。
统一映射有两种方向,选哪个取决于链接来源。
如果两种来源混用,优先选“以对外规范 URL 为准”,因为对外 URL 一旦被引用和缓存,改动成本更高。但如果磁盘上文件本身就是混合大小写且无法批量重命名,则应反过来以磁盘为准,避免重写指向不存在的文件。
不要凭感觉改。先做一次比对,把“引用中出现的路径”和“磁盘上实际存在的路径”分别导出,按小写归一后做差集。差集里出现的项,就是真正会出问题的路径。
比对结果会影响下一步动作:
重写映射要放在请求进入应用之前,并且要保证只做一次归一,避免大小写转换后又被另一条规则改回去。做完之后,用同一路径的大小写变体各请求一次,确认它们最终落到同一目标。这个动作的结果直接决定下一步:如果变体仍然返回不同内容,说明归一没有覆盖全部入口,需要回到比对结果检查是否漏了某个引用来源。
有几类问题看起来像大小写差异,但改映射没用:
遇到这些情况,要先确认差异到底发生在请求链路哪一环,再决定是在映射层处理,还是在应用或数据层处理。把映射层当成万能层,只会让问题在别处复现。
假设一台服务器上有三个站点共享同一套图片目录,磁盘上文件名统一为小写,但其中一个站点的模板引用了大写路径。按上面的方法,先比对差集,发现只有该站点的大写引用不在磁盘实际路径中。此时选择“以磁盘为准”,在重写层把大写形式归一到小写,然后分别用小写和大写请求同一张图片,确认返回内容一致且状态码相同。如果两者状态码仍不同,说明归一规则没有命中该请求,需要检查规则顺序和匹配范围。这个验证结果决定是继续调整规则,还是回到模板层修正引用。
统一映射的目标不是让所有路径长得一样,而是让同一资源无论以哪种大小写被请求,都落到同一个确定目标,并且这个目标在磁盘和引用两侧都真实存在。先判断层,再选方向,最后用变体请求验证,才能避免改了映射却仍在别处复现。