linux下图片404主因是大小写不匹配和路径映射错误:文件系统区分大小写导致logo.png与logo.png不一致;子目录迁移后相对路径解析失效;nginx的root/alias配置错误或缺失斜杠;cdn或浏览器缓存旧路径。

图片路径在 Linux 下大小写不匹配直接 404
Linux 文件系统默认区分大小写,而开发环境(如 Windows/macOS)通常不区分。迁移后常见现象是:本地 logo.PNG 能显示,线上却返回 404;浏览器 Network 面板里请求的 URL 明明存在,但响应是 404 —— 很可能是因为 HTML 或 CSS 里写的是 logo.png,而服务器上实际文件名是 logo.PNG 或 Logo.png。
实操建议:
- SSH 登录服务器,进到图片目录,运行
ls -l看真实文件名(注意大小写、空格、点号位置) - 用
grep -r "logo\.png" /www/wwwroot/example.com/ --include="*.html" --include="*.php" --include="*.css"检查所有引用处是否一致 - 别依赖「重命名」图床或 FTP 工具自动转小写——FileZilla 的“强制小写”选项只改上传时的文件名,不改代码里写的路径
- 统一策略:全部转为小写 + 重写引用。可用命令批量改文件名:
find /www/wwwroot/example.com/uploads -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;(慎用,先备份)
相对路径在跨域名/子目录迁移后失效
原站是 http://old.com,迁移到 https://new.com/blog/ 后,HTML 中写的 src="images/logo.png" 会拼成 https://new.com/images/logo.png(404),而不是预期的 https://new.com/blog/images/logo.png。这不是权限或 MIME 问题,是路径解析逻辑变了。
实操建议:
- 检查网站是否启用了子目录部署(比如 WordPress 的「站点地址」和「WordPress 地址」不一致),这会影响所有相对路径的 base URL
- 临时加一行 HTML 测试:
<base href="/blog/">放在里,看是否修复;若有效,说明是 base URL 缺失 - PHP 项目中避免硬写
images/xxx,改用get_template_directory_uri()(WordPress)或$_SERVER['REQUEST_URI']动态拼接 - 静态站点可全局替换:用
sed -i 's/src="images\//src="\/blog\/images\//g' *.html(注意备份后再执行)
宝塔 Nginx 配置漏掉 root 或 alias,导致路径映射错位
迁移时如果手动改过网站配置,容易删掉或写错 root 指令,或者对子目录做了 location /uploads/ { alias /www/wwwroot/example.com/files/; } 却忘了末尾斜杠,Nginx 就会把 /uploads/logo.png 映射成 /www/wwwroot/example.com/fileslogo.png(缺了 /),结果找不到文件,返回空白或 404。
实操建议:
- 进宝塔 → 网站 → 设置 → 配置文件,确认
server块里有且仅有一个root指向正确根目录(如/www/wwwroot/example.com) - 若用了
alias,必须保证路径结尾一致:location /static/ { alias /www/wwwroot/example.com/assets/; }—— 注意alias值末尾有/,而location值末尾也有/ - 测试配置语法:
nginx -t,再重载:bt reload或面板点「重载配置」 - 加一行日志快速定位:
log_not_found on;在server块里,然后看/www/wwwlogs/example.com.error.log里报的「open() "/xxx" failed」路径是否是你以为的路径
图片被缓存或 CDN 回源到旧路径
看起来是“显示不全”,其实是部分图片加载成功、部分失败,尤其集中在某个子目录(比如 /wp-content/uploads/)。这时候大概率不是服务器配置问题,而是浏览器或 CDN 缓存了旧的 301/302 跳转、或回源时仍用旧域名请求源站。
实操建议:
- 浏览器隐身窗口 + 强制刷新(Ctrl+Shift+R),排除本地缓存
- 查 Network 面板,看失败图片的 Request URL 是不是指向旧域名;如果是,说明 HTML/CSS/JS 里还有硬编码
- 如果你开了 CDN(如 Cloudflare),进 CDN 后台清缓存,并关掉「自动重写 URL」或「优化图片」等可能干扰路径的开关
- 宝塔自带的「缓存」插件(如 Memcached、Redis)不会影响静态图片,但若你用 PHP 动态输出图片(
image.php?src=xxx),就得检查该脚本是否还读着旧路径配置











