先给结论:大小写差异导致的死链,不能靠“把所有链接改成小写”解决,而要先确定服务器和发布链路把哪个路径当作真实文件,再在“统一生成规则”与“保留原路径并加映射”之间做选择。缺少完整日志或服务器权限时,仍可抽取少量样本,对比链接写法、实际文件、响应状态和重定向目标,判断问题出在生成、部署还是服务端匹配。
常见情形是:页面里的链接写的是 /Images/Banner.png,文件系统里只有 /images/banner.png。在大小写不敏感的服务器或本地环境上,它能正常返回;换到大小写敏感的服务器、对象存储或容器镜像后,同一路径就可能返回 404。于是检测工具报死链,人工点击却未必复现。
还有一类相反现象:链接本身大小写正确,但部署时构建脚本把目录名改成了小写,或者打包工具只保留了一种写法。此时问题不在页面模板,而在发布产物。
模板、富文本、旧数据迁移和手工录入可能各自保留不同大小写。表现是同一资源在全站出现多种写法,例如导航用小写、正文用首字母大写、站点地图又用另一种。若只有部分页面出错,且错误链接集中在某类模板或某批历史内容,生成端不一致的可能性更高。
文件实际存在,但服务端把 Banner.png 与 banner.png 视为两个对象。表现是同一路径在不同环境结果不同,或部署后突然集中出现 404。若同一写法在旧服务器可用、新服务器不可用,或者对象存储返回“未找到”而不是应用层错误,服务端匹配规则更值得优先核查。
不需要完整访问日志,也能用一组小样本缩小范围。选取同一资源的几种写法,分别记录:请求路径、响应状态、最终重定向地址、实际返回内容类型。重点不是“哪个状态码最多”,而是同一资源在不同写法下是否出现稳定分叉。
这些现象只能说明匹配行为,不能单独证明某次改动就是根因。缓存、CDN 回源、发布未完成和权限差异,都可能造成类似结果。
如果站点仍可重新生成链接,优先统一生成规则:在模板、数据导入和站点地图中使用同一种大小写,并让构建流程检查产物中的路径。这个动作的结果是减少未来新增变体,但它不会自动修复已被收录或已被外部引用的旧地址。
如果旧链接已经被外部引用、无法全部改回,或者不同渠道必须保留原写法,就需要在服务端或边缘层建立映射:把已知的错误大小写写法指向真实资源,并返回合适的重定向状态。这个动作的结果是旧入口仍可到达,但映射表需要维护;一旦新增变体没有加入,死链仍会出现。
选择依据可以简化为三点:能否重新发布全部页面;外部引用是否可控;服务端是否允许配置重定向。三者都满足时,统一生成规则更干净;外部引用不可控时,映射更现实。两者并不互斥,常见做法是先统一生成,再为存量地址保留一段时间的映射。
没有服务器权限和完整日志时,仍可做三件事:第一,抽取首页、栏目页、详情页各若干链接,记录原始大小写写法;第二,对同一资源手动替换大小写,观察响应状态和最终地址;第三,把结果按“生成端变体”和“服务端匹配差异”分开记录,而不是直接交给开发一句“有死链”。
假设某站有 20 个图片链接报错,其中 18 个只是首字母大写不同,另外 2 个路径完全不存在。前者适合进入映射或生成规则修复,后者仍需按真实缺失处理。这个例子只用于说明分类方法,不代表任何真实站点的比例。
能推出的结论是:大小写差异可以被稳定复现,并且能定位到某一层。不能推出的结论是:修复映射后所有死链都会消失,或者搜索引擎一定会在某个时间完成替换。站点地图和 robots.txt 也不能替代这一步核查;它们不保证收录,也不等于可靠的移除手段。下一步应把确认过的真实路径写回生成规则,并为无法改回的旧地址建立可审查的映射清单。