Discuz 更换服务器后图片不显示,通常是因为数据库中的附件地址仍指向旧服务器域名或路径,或者新服务器文件权限配置错误。最直接的修复方式是核对配置文件中的附件 URL 设置,并在后台使用数据库工具替换旧域名。
先说结论:修复核心在于统一数据库存储路径与新服务器实际访问地址,同时确保附件目录可读。
- 先确认 config/config_global.php 中的附件 URL 配置是否匹配新域名
- 先处理数据库中存储的旧域名链接,使用后台替换工具批量修改
- 再验证 attachment 目录及子目录的读写权限是否已正确赋予 Web 服务用户
命令速用版
如果无法登录后台,可通过直接修改配置文件或执行 SQL 语句快速修正路径。以下操作需在备份数据库后进行。
检查配置文件路径:
查看站点根目录下的 config/config_global.php 文件,确认 $_config['attachurl'] 相关设置。
数据库替换命令示例:
若域名从 old.com 变更为 new.com,可在 phpMyAdmin 或命令行执行以下 SQL 逻辑(表前缀请根据实际修改):
UPDATE pre_common_attachment SET filepath = REPLACE(filepath, 'old.com', 'new.com');
UPDATE pre_forum_post SET message = REPLACE(message, 'old.com', 'new.com');
为什么会这样
Discuz 在发布内容时会将附件路径以绝对 URL 或相对路径形式存入数据库,迁移服务器后若域名或目录结构变化,原有路径无法解析。
Discuz X 系列版本通常将附件信息存储在 pre_common_attachment 表中,而帖子内容中的图片链接直接嵌入在 pre_forum_post 的 message 字段里。更换服务器时,如果仅迁移了文件而未更新数据库中的域名引用,或者新服务器的 Web 根目录路径与旧服务器不一致,就会导致前端请求资源时返回 404 错误。此外,Linux 服务器迁移后,文件所有者可能变为 root 而非 www 或 www-data,导致权限拒绝。
分步处理
按照以下顺序操作,每步完成后记录状态,以便出错时回滚。
第一步:核对全局配置文件
登录服务器,编辑 config/config_global.php。检查 $_config['attachurl'] 或相关 URL 配置项。如果站点使用了独立附件服务器,需确保该配置指向新服务器的正确地址。若未修改过默认配置,通常 Discuz 会自动识别当前域名,但硬编码的旧域名需手动清除。
第二步:使用后台数据库工具替换
登录 Discuz 管理中心,进入“工具”->“数据库”->“替换”。选择包含附件路径的表(如 pre_common_attachment、pre_forum_post)。在“被替换内容”填写旧域名或旧路径,在“替换为”填写新域名或新路径。点击提交执行。此操作会修改数据库记录,务必先备份。
第三步:修正文件权限
在服务器终端执行权限命令,确保 Web 服务用户可读写附件目录。常见命令如下:
chown -R www:www ./attachment
chmod -R 755 ./attachment
注意用户组 www 需根据实际环境调整为 www-data 或 nginx。
第四步:清理缓存
在管理中心进入“工具”->“更新缓存”,勾选“数据缓存”和“模板缓存”。同时删除 data/cache 目录下的文件,防止旧路径被缓存文件锁定。
怎么验证是否生效
通过浏览器开发者工具和前台页面表现确认修复结果。
检查前台页面:刷新含有图片的帖子页面,观察图片是否正常加载,无 broken image 图标。
检查网络请求:按 F12 打开开发者工具,切换到 Network 标签页,刷新页面。查看图片资源的状态码,应为 200 OK。若仍为 404,点击资源链接查看 URL 是否仍包含旧域名。
检查源代码:在页面右键查看源代码,搜索 attachment 关键字,确认 src 属性中的路径已更新为新服务器地址。
常见坑
以下场景容易导致修复后问题复发,操作时需格外谨慎。
HTTPS 混合内容:如果新服务器启用了 HTTPS,而数据库中的图片链接仍为 HTTP,浏览器可能拦截加载。需确保替换时将 http://old.com 替换为 https://new.com。
静态文件缓存:部分 CDN 或反向代理缓存了旧路径的 404 响应。修复后需 purge CDN 缓存,或等待缓存过期。
UCenter 路径不同步:如果站点集成了 UCenter,需同时检查 uc_server/data/ 目录下的配置文件,确保头像等附件路径也已完成迁移和替换。
常见问题
更换服务器后只有一部分图片不显示怎么办
通常是因为这部分图片存储在旧服务器的特定目录或未同步到新服务器。检查 attachment 目录下的子文件夹(如 forum、group)是否完整迁移,并核对数据库中该部分图片的路径前缀。
可以直接修改数据库表结构来修复吗
不建议直接修改表结构,应通过 UPDATE 语句修改数据内容。修改表结构可能导致 Discuz 程序校验失败,引发更严重的数据库错误。
使用 IP 访问服务器时图片不显示正常吗
正常。Discuz 默认配置通常绑定域名,若使用 IP 访问,配置文件中的域名设置与访问地址不一致可能导致资源加载失败。建议绑定 hosts 或使用正式域名测试。
参考来源
Discuz! Official GitHub Repository, DiscuzX File Structure, https://github.com/Discuz/DiscuzX