网站迁移后图片无法显示,通常不是单一原因造成的。根据 WordPress 高级管理文档和 Web 性能指南,问题往往出在文件路径、数据库配置、服务器权限或缓存机制上。本文提供一套系统的排查路径,帮助你快速定位并解决。
先判断:图片无法显示的直接原因
当图片无法显示时,先打开浏览器开发者工具(F12),查看图片请求的 HTTP 状态码。常见的有:
- 404 Not Found:文件路径错误或文件未上传。
- 403 Forbidden:目录或文件权限不足。
- 500 Internal Server Error:服务器配置或 .htaccess 问题。
- 200 OK 但图片空白:文件损坏或 MIME 类型错误。
根据状态码,可以快速缩小排查范围。
检查文件路径:相对路径与绝对路径
迁移后最常见的错误是图片路径未更新。如果网站从子目录迁移到根目录,或域名变更,数据库中存储的绝对路径(如 http://old-domain.com/wp-content/uploads/)会失效。WordPress 官方文档建议检查 wp_options 表中的 siteurl 和 home 字段,确保它们指向新地址。
此外,检查主题和插件中是否有硬编码的图片路径。使用数据库替换工具(如 WP-CLI 的 search-replace)批量更新 URL,但注意不要替换序列化数据,否则可能损坏数据。
数据库中的图片附件记录
如果图片文件存在但页面不显示,可能是数据库中的附件记录指向了错误的路径。在 WordPress 中,图片的 URL 存储在 wp_posts 表的 guid 字段,但 guid 不应作为引用依据,实际引用的是 wp_postmeta 中的 _wp_attached_file。迁移后,如果这些记录未更新,会导致图片无法加载。
建议使用插件(如 WordPress 高级管理文档 中提到的工具)或 SQL 查询来检查和更新这些字段。注意数据库备份,以防操作失误。
文件权限与目录结构
服务器文件权限不正确会导致 403 错误。通常,目录权限应为 755,文件权限应为 644。如果迁移时使用了压缩包解压,权限可能被重置。使用 SSH 执行 find /path/to/uploads -type d -exec chmod 755 {} ; 和 find /path/to/uploads -type f -exec chmod 644 {} ; 可批量修复。
另外,确认上传目录 wp-content/uploads 存在且包含按年份/月份组织的子目录。如果移动了站点,确保目录结构完整。
缓存与 CDN 问题
迁移后,浏览器缓存或 CDN 缓存可能导致旧图片 URL 被缓存。Web 性能指南指出,缓存可以显著提升加载速度,但迁移后需要清除缓存以获取最新资源。建议:
- 清除浏览器缓存(Ctrl+F5 强制刷新)。
- 如果使用 CDN,刷新 CDN 缓存或等待 TTL 过期。
- 检查 WordPress 缓存插件(如 W3 Total Cache)并清空缓存。
URL 重写规则与 .htaccess
Apache 服务器使用 .htaccess 文件处理重写规则。迁移后,如果 .htaccess 未正确配置,可能导致图片请求被错误重写。WordPress 默认的 .htaccess 规则用于处理固定链接,但若其他重写规则冲突,图片可能无法访问。尝试临时重命名 .htaccess 文件,测试图片是否恢复,若恢复则需调整规则。
对于 Nginx,检查 try_files 指令是否包含图片目录。
SSL 证书与混合内容
如果迁移后启用了 HTTPS,但页面中仍引用 HTTP 图片,浏览器会阻止加载。检查页面源码,确认图片 URL 使用 HTTPS。可以使用数据库替换将所有 http:// 替换为 https://,但注意排除非网页资源。此外,确保 SSL 证书覆盖新域名,否则也会导致加载失败。可参考 网站迁移后SSL证书重新部署指南。
常见误区与失败条件
- 只改数据库不更新文件:如果文件未上传,路径再正确也无效。
- 忽略大小写:Linux 服务器区分大小写,Windows 不区分,迁移到 Linux 后文件名大小写不匹配会导致 404。
- 使用不正确的替换工具:直接 SQL 替换可能破坏序列化数据,导致整个站点出错。
- 忘记检查对象缓存:如 Redis/Memcached,缓存旧数据可能导致图片不显示。
参考资料
延伸阅读
