WordPress 迁移后图片不显示怎么排查?URL、权限与缩略图修复
WordPress 迁移完成后,首页能打开、后台也能登录,但文章图片、特色图或媒体库缩略图突然不显示,这是很常见的一类“看起来像图片问题,实际可能断在不同层”的故障。
我处理这类问题时,不会先装“修复媒体库”插件,也不会一上来就重新生成全部缩略图。更稳的做法是先拿一张失败图片当样本,沿着页面引用 → HTTP 响应 → 磁盘文件 → WordPress 附件记录 → 派生尺寸逐层检查。定位在哪一层断了,再只修那一层。
先用一张失败图片,把问题分到正确的层

在浏览器里对失败图片点“在新标签页中打开”,或者在开发者工具的 Network 面板里找到图片请求,先记下三件事:
- 请求 URL 是旧域名、当前域名,还是 CDN / 对象存储域名;
- HTTP 状态是 200、301/302、403、404,还是被浏览器拦截;
- 失败的是所有图片、只有旧文章图片,还是只有某个尺寸。
| 现象 | 优先怀疑 | 先做的检查 |
|---|---|---|
| 图片 URL 仍是旧域名 | 数据库里的旧地址未替换 | 对旧 URL 做 WP-CLI dry-run |
| 当前域名返回 404 | uploads 文件没传全,或路径不一致 | 把 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 中的
src、srcset和懒加载属性; - 页面缓存、对象缓存和图片优化插件的 CDN / WebP 映射;
- CDN 边缘节点是否仍缓存旧的 404 或重定向;
- 主题 CSS、内联样式和页面构建器生成文件里的背景图 URL。
清缓存应该放在根因修复之后。否则缓存一清暂时恢复,过一会插件重新生成错误 URL,问题还会回来。
一套可以复用的检查顺序
- 选一张失败图片,记录 URL、HTTP 状态和页面位置;
- URL 是旧地址:先 search-replace dry-run;
- 当前地址 404:把 URL 映射到 uploads 文件;
- 403:对比正常文件的权限并查看服务端拒绝日志;
- HTTP 被拦截:修正站点地址、代理 HTTPS 识别和数据库引用;
- 原图正常而缩略图缺失:单附件验证 metadata 与 regenerate;
- 最后清理相关缓存,复查前台和移动端。
这套顺序的重点不是命令本身,而是每一步都先拿到证据。图片 URL 错了就修引用,文件丢了就补文件,权限拒绝就修权限,只有派生尺寸缺失才重建缩略图。这样既能缩小改动范围,也更容易回滚。
参考资料:WordPress《Migrating WordPress》、WP-CLI《wp search-replace》、WP-CLI《wp media regenerate》




