网站已运行 162 · 16小时 · 54 · 06
目录

WordPress 迁移后图片不显示怎么排查?URL、权限与缩略图修复

WordPress 迁移后图片链路中断并通过放大镜排查的概念图

WordPress 迁移完成后,首页能打开、后台也能登录,但文章图片、特色图或媒体库缩略图突然不显示,这是很常见的一类“看起来像图片问题,实际可能断在不同层”的故障。

我处理这类问题时,不会先装“修复媒体库”插件,也不会一上来就重新生成全部缩略图。更稳的做法是先拿一张失败图片当样本,沿着页面引用 → HTTP 响应 → 磁盘文件 → WordPress 附件记录 → 派生尺寸逐层检查。定位在哪一层断了,再只修那一层。

先用一张失败图片,把问题分到正确的层

WordPress 迁移后图片不显示的五层排查流程
先确认页面引用的 URL,再检查响应、文件、附件元数据和缩略图;不要跳过前面的证据直接重建图片。

在浏览器里对失败图片点“在新标签页中打开”,或者在开发者工具的 Network 面板里找到图片请求,先记下三件事:

  1. 请求 URL 是旧域名、当前域名,还是 CDN / 对象存储域名;
  2. HTTP 状态是 200、301/302、403、404,还是被浏览器拦截;
  3. 失败的是所有图片、只有旧文章图片,还是只有某个尺寸。
现象优先怀疑先做的检查
图片 URL 仍是旧域名数据库里的旧地址未替换对旧 URL 做 WP-CLI dry-run
当前域名返回 404uploads 文件没传全,或路径不一致把 URL 映射到实际文件
返回 403权限、防盗链、WAF 或 CDN 规则对比原图与同目录正常文件
HTTP 图片被 HTTPS 页面拦截混合内容检查页面源码和浏览器控制台
原图正常,缩略图 404派生尺寸缺失或元数据过期查附件 metadata,再定向 regenerate
清缓存后仍请求旧 CDN页面缓存、对象缓存或 CDN 映射查最终 HTML 中实际输出的 URL
同样是“图片不显示”,修复对象可能完全不同。

如果同一站点不只是图片,而是文章、页面或分类的美化 URL 也集中返回 404,应改查 WordPress 固定链接与服务器重写规则,不要继续在 uploads 目录里排查。

一、URL 还是旧域名:先 dry-run,不要直接改数据库

更换域名、从测试站切到正式站,或把 WordPress 从子目录移到根目录后,文章正文、区块属性、页面构建器数据和附件字段里都可能残留旧地址。WordPress 官方迁移文档也特别提醒:直接用普通 SQL 替换可能破坏序列化数据。

如果服务器已安装 WP-CLI,我一般先只看影响范围:

wp search-replace 'https://old.example.com' 'https://new.example.com' 
  --all-tables-with-prefix --skip-columns=guid --dry-run

--dry-run 不会写入数据库;--skip-columns=guid 用来避免把文章 GUID 当成普通链接处理。先确认表名、命中行数和新旧地址完全正确,再创建数据库备份并去掉 --dry-run 执行。

这一步不要只搜 http://旧域名。实际项目里还要分别检查 https://旧域名、带不带 www、旧子目录和旧 CDN 域名。它们是不同字符串,不能假设一次替换全部覆盖。

二、URL 正确但 404:确认 uploads 文件真的在新服务器

页面里写的是当前域名,并不代表文件已经完整迁移。复制数据库但漏传 wp-content/uploads,或者归档包解压时少了一部分年月目录,都会让附件记录存在、实际文件缺失。

先查看 WordPress 当前上传目录:

wp eval 'print_r( wp_upload_dir() );'

假设失败 URL 是:

https://new.example.com/wp-content/uploads/2026/08/sample-768x432.jpg

就检查对应年月目录里有没有这个派生尺寸,以及原图 sample.jpg 是否存在。可以先列出候选文件,不要直接创建或删除:

find wp-content/uploads/2026/08 -maxdepth 1 -type f 
  -name 'sample*' -printf '%fn'

如果原图和所有尺寸都不在,新服务器缺的是文件,重新生成缩略图也没有原料。此时应该回到迁移包、旧服务器或远程备份补齐 uploads。本站的 UpdraftPlus 腾讯云 COS 备份教程也解释了为什么数据库和 uploads 需要作为两类恢复对象核对。

三、返回 403:检查权限、防盗链和安全规则

403 说明请求已经到达服务器或 CDN,但访问被拒绝。常见原因包括文件权限、目录权限、Nginx / Apache 规则、对象存储防盗链、CDN Referer 规则和安全插件限制。

curl -I 'https://new.example.com/wp-content/uploads/2026/08/sample.jpg'
namei -l wp-content/uploads/2026/08/sample.jpg
stat wp-content/uploads/2026/08/sample.jpg

不要看到 403 就递归执行 chmod -R 777。先找一张同目录、能正常访问的图片,对比属主、用户组和权限;再检查 Web 服务器日志里这次请求的拒绝原因。只修正异常项,比全站放宽权限安全得多。

四、HTTPS 页面加载 HTTP 图片:处理混合内容

迁移同时启用 HTTPS 后,正文或 CSS 仍引用 http:// 图片,浏览器可能直接拦截。控制台通常会出现 Mixed Content 提示。这类问题不能靠重新上传图片解决,因为文件本身可能完全正常。

先确认 WordPress 的两个核心地址:

wp option get home
wp option get siteurl

再对旧 HTTP 地址执行 search-replace dry-run。若站点经过反向代理或 CDN,还要确认源站能正确识别 HTTPS;否则 WordPress 或插件可能继续生成 HTTP 链接。修复后查看最终页面源码,不能只看后台设置框。

如果图片没有 404,只是发现上传一张原图后出现了多种带尺寸后缀的文件,不要沿用迁移故障的修复流程。可以先看 WordPress 自动生成很多缩略图的尺寸盘点与安全处理方法,分清注册尺寸、附件 metadata 与实际文件,再决定是否需要清理。

五、只有缩略图不显示:再查附件元数据和派生尺寸

如果原图 URL 返回 200,但 -150x150-768x432 等尺寸返回 404,才轮到缩略图这一层。先找到附件 ID,再查看 WordPress 记录的相对路径和尺寸:

wp post meta get 123 _wp_attached_file
wp post meta get 123 _wp_attachment_metadata --format=json

确认原图存在并且备份可恢复后,可以只对单个附件重建:

wp media regenerate 123 --yes

单图验证成功,再决定是否扩大范围。不要为了修一张图先对整个媒体库执行 wp media regenerate --yes;图片多的站点会消耗 CPU、磁盘和时间,还可能生成主题新注册的多套尺寸。

六、文件与数据库都正常:检查缓存、CDN 和图片优化层

如果图片直接打开正常,但页面仍输出旧域名或不存在的 CDN 地址,问题通常在缓存或 URL 重写层。按离用户最近的输出结果往回查:

  • 最终 HTML 中的 srcsrcset 和懒加载属性;
  • 页面缓存、对象缓存和图片优化插件的 CDN / WebP 映射;
  • CDN 边缘节点是否仍缓存旧的 404 或重定向;
  • 主题 CSS、内联样式和页面构建器生成文件里的背景图 URL。

清缓存应该放在根因修复之后。否则缓存一清暂时恢复,过一会插件重新生成错误 URL,问题还会回来。

一套可以复用的检查顺序

  1. 选一张失败图片,记录 URL、HTTP 状态和页面位置;
  2. URL 是旧地址:先 search-replace dry-run;
  3. 当前地址 404:把 URL 映射到 uploads 文件;
  4. 403:对比正常文件的权限并查看服务端拒绝日志;
  5. HTTP 被拦截:修正站点地址、代理 HTTPS 识别和数据库引用;
  6. 原图正常而缩略图缺失:单附件验证 metadata 与 regenerate;
  7. 最后清理相关缓存,复查前台和移动端。

这套顺序的重点不是命令本身,而是每一步都先拿到证据。图片 URL 错了就修引用,文件丢了就补文件,权限拒绝就修权限,只有派生尺寸缺失才重建缩略图。这样既能缩小改动范围,也更容易回滚。

参考资料:WordPress《Migrating WordPress》WP-CLI《wp search-replace》WP-CLI《wp media regenerate》

数臻源码猫咪图标
目录
数臻源码猫咪图标

目录

标签云: