先给结论:当WordPress更换服务器后出现“本地正常、线上白屏”或“图片时有时无”,而数据库连接、PHP版本都没变,路径大小写差异就是高概率原因。统一映射的做法不是全站改成小写,而是先确认文件系统是否大小写敏感,再决定用重定向、批量改名还是修改主题代码中的路径引用。下面用一个明确标为假设的情境串起整个决策过程。
假设某站点从Windows开发环境迁移到Linux服务器。原主题代码里写的是 <img src="/wp-content/Uploads/2024/logo.PNG">,而实际磁盘目录是 uploads,文件名是 logo.png。在Windows下,文件系统不区分大小写,浏览器请求 Uploads/logo.PNG 也能命中;换到Linux后,文件系统区分大小写,同一个请求返回404。表现就是:首页部分图片裂开,而数据库里存的附件URL又是另一套大小写,于是同一张图在不同页面表现不一致。
这个假设情境的关键证据是:404日志里出现的路径大小写,与磁盘上真实路径不完全一致。如果日志里请求的是正确路径却仍然404,那问题就不在大小写,而在权限或Nginx/Apache的rewrite规则。
登录服务器执行 ls -la wp-content,看真实目录名。Linux下 Uploads 和 uploads 是两个不同目录,如果只有其中一个存在,就能确认磁盘侧没有另一个。此时不要急着全站改名,先区分三种情况:
Uploads 和 uploads 两个目录:这是迁移工具或手动上传造成的重复,先合并再谈映射。用一个动作验证:在浏览器直接请求一个已知404的图片URL,把路径中的大写字母逐个改成小写再请求。如果小写版本返回200,大小写差异就被证实;如果两者都404,则问题在别处,比如文件确实没迁过来。
适用条件是站点文件数量可控,且没有外部系统硬编码引用大写路径。用 find 配合 rename 或脚本批量改名,然后同步更新数据库中的 guid 和附件URL。风险是:如果某些页面内容里手写了带大写的图片路径,改名后这些引用会失效,需要一并搜索替换。
适用条件是无法改动文件,或改动成本太高。在Nginx中可以用 location 配合正则做大小写不敏感匹配,或者用 try_files 尝试小写路径。Apache下可用 mod_speling 或 RewriteMap。这种做法的代价是每次请求多一次匹配开销,且规则写错可能影响其他静态资源。动作是:先在一个测试路径上验证重定向规则,确认只对目标目录生效,再全站启用。
适用条件是问题集中在少数几个模板文件或插件。用编辑器搜索主题目录下所有 src=、href=、include、require 中的路径,把大小写改成与磁盘一致。这个动作的结果会直接影响下一步:如果改完后仍有404,说明还有数据库中的序列化数据或缓存文件在引用旧路径,需要清理缓存并检查 wp_options 中的相关记录。
大小写差异有一个可核对的证据:同一文件,路径大小写不同时,一个返回200、一个返回404。如果两者都404,或者两者都200,那就不属于大小写问题。另一种合理解释是:文件权限不对,导致Web服务器无法读取;或者 .htaccess 规则在迁移后没有同步,导致重写路径错乱。还有一种情况是CDN缓存了旧路径的404响应,此时即使服务器已修复,边缘节点仍返回404,需要刷新缓存后再验证。
注意,robots.txt的抓取限制不等于索引移除,站点地图也不保证收录。这些与路径大小写没有直接因果关系,不要把它们当作解释404的依据。
ls 确认磁盘真实路径大小写。wp-config.php 中的 WP_CONTENT_DIR 和 WP_CONTENT_URL 是否指向了错误的大小写路径。这个顺序的价值在于:每一步的观察结果都会缩小下一步的范围。如果第2步就发现两种URL都返回200,那说明服务器已经做了大小写不敏感处理,问题可能出在浏览器缓存或页面内链,而不是文件系统本身。假设情境中,执行改名后图片恢复,但某个插件后台仍报错,进一步检查发现该插件在数据库里存了旧的大写路径,这就是改名动作没有覆盖到的部分,需要单独处理。