将网站中的图片地址(URL)从原来的相对路径或主域名路径,批量修改为指向二级域名的绝对路径。

下面我将为你提供详细、分步的操作方法,涵盖从配置到修改的全过程。
第一步:准备工作与服务器配置
在修改 DedeCMS 之前,必须确保你的服务器已经正确配置了二级域名,并且该域名可以正常访问到你的图片资源。
-
创建二级域名:
- 在你的域名解析管理后台(如阿里云、腾讯云等),为你的主域名(
yourdomain.com)添加一个A记录或CNAME记录,指向你的服务器 IP。 - 创建一个二级域名
img.yourdomain.com。
- 在你的域名解析管理后台(如阿里云、腾讯云等),为你的主域名(
-
配置服务器虚拟主机:
(图片来源网络,侵删)-
Nginx 配置示例: 你需要在 Nginx 的配置文件中,为
img.yourdomain.com这个域名单独创建一个server块,并将其root指向你 DedeCMS 网站中存放图片的目录。# 主站配置 server { listen 80; server_name yourdomain.com www.yourdomain.com; root /path/to/your/dedecms; // DedeCMS 根目录 # ... 其他主站配置 } # 图片服务器配置 server { listen 80; server_name img.yourdomain.com; root /path/to/your/dedecms/uploads; // 直接指向上传目录 # 防止盗链的配置(可选但推荐) location ~* \.(jpg|jpeg|png|gif|bmp|swf)$ { valid_referers none blocked yourdomain.com www.yourdomain.com; if ($invalid_referer) { return 403; } } # 缓存配置(可选,提升性能) location ~* \.(jpg|jpeg|png|gif|bmp|swf)$ { expires 7d; add_header Cache-Control public; } } -
Apache 配置示例: 在 Apache 的虚拟主机配置文件中,同样需要为
img.yourdomain.com创建一个VirtualHost。# 主站配置 <VirtualHost *:80> ServerName yourdomain.com DocumentRoot /path/to/your/dedecms # ... 其他主站配置 </VirtualHost> # 图片服务器配置 <VirtualHost *:80> ServerName img.yourdomain.com DocumentRoot /path/to/your/dedecms/uploads # 防止盗链的配置(可选但推荐) <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?img.yourdomain.com [NC] RewriteRule \.(jpg|jpeg|png|gif|bmp|swf)$ - [F] </IfModule> # 缓存配置(可选) <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpeg "access plus 7 days" ExpiresByType image/png "access plus 7 days" ExpiresByType image/gif "access plus 7 days" </IfModule> </VirtualHost> -
重要提示:修改完 Nginx 或 Apache 配置后,务必执行
nginx -s reload或service apache2 restart/service httpd restart命令使配置生效。
-
-
测试图片服务器:
(图片来源网络,侵删)- 在 DedeCMS 后台随便上传一张图片,假设路径是
/uploads/allimg/230101/123456.jpg。 - 在浏览器中访问
http://img.yourdomain.com/uploads/allimg/230101/123456.jpg,如果图片能正常显示,说明服务器配置成功,这是后续所有操作的基础。
- 在 DedeCMS 后台随便上传一张图片,假设路径是
第二步:修改 DedeCMS 配置(推荐方法)
这是最安全、最规范的方法,通过修改 DedeCMS 的核心配置文件,让系统在调用图片时自动使用新的域名。
-
找到核心函数文件:
- DedeCMS 调用图片的路径通常由一个函数决定,这个函数位于
/include/helpers/channelunit.helper.php文件中。
- DedeCMS 调用图片的路径通常由一个函数决定,这个函数位于
-
修改函数
GetMkUrl():- 用代码编辑器打开
/include/helpers/channelunit.helper.php文件。 - 找到
function GetMkUrl($typeid, $typeurl, $namerule, $isdefault, $ispart, $siteurl, $sitepath)这个函数。 - 在函数内部,找到生成图片路径的代码段,通常是在返回
$typeurl或$murl之前。 - 修改思路:在最终返回的 URL 前面,拼接上你的图片服务器域名。
修改示例(V5.7 版本为例): 在函数的末尾,
return $murl;这行代码之前,加入以下代码:// 在 return $murl; 之前添加 // 判断是否为图片路径,如果是则替换域名 if (strpos($murl, '/uploads/') !== false) { // 定义你的图片服务器域名 $img_domain = 'http://img.yourdomain.com'; // 将原路径中的域名替换为图片服务器域名 // 使用 preg_replace 来确保只替换域名部分,不影响路径 $murl = preg_replace('/^https?:\/\/[^\/]+/', $img_domain, $murl); }- 代码解释:
strpos($murl, '/uploads/') !== false:判断生成的路径是否包含/uploads/,这是 DedeCMS 默认的图片上传目录,你可以根据实际情况调整这个判断条件。$img_domain = 'http://img.yourdomain.com':设置你的图片服务器域名。preg_replace(...):这是一个强大的替换函数,它会找到 URL 开头的http://...部分,并将其替换为你设置的$img_domain。
- 用代码编辑器打开
-
保存文件并测试:
- 保存修改后的
channelunit.helper.php文件。 - 清空浏览器缓存,重新访问你的网站首页和内容页,使用浏览器开发者工具(F12)的 "Network" 面板检查图片的请求地址,你会发现它们已经变成了
http://img.yourdomain.com/...的形式。
- 保存修改后的
第三步:数据库批量替换(备选或补充方法)
如果你的网站已经运行了很久,数据库中存在大量旧的数据,或者上述方法无法覆盖所有情况(比如自定义模型、内容通过其他方式添加的),那么需要进行数据库的批量替换。
⚠️ 重要警告:操作数据库前,务必备份数据库!
-
登录数据库管理工具:
使用 phpMyAdmin 或其他工具登录到你的 DedeCMS 数据库。
-
确定要修改的表和字段:
- 主表:
#@__archives(文章表),主要字段是litpic(缩略图) 和body(文章正文)。 - 附加表:
#@__addonarticle(文章模型附加表),字段body。 - 其他模型表:如果你使用了图集、产品等其他模型,还需要修改对应的附加表,
#@__addonimages(图集) 等。 - 自定义字段:任何你用来存放图片路径的自定义字段。
- 主表:
-
执行 SQL 替换语句:
- 在 phpMyAdmin 中,选择你的数据库,然后点击 "SQL" 选项卡,执行以下语句。
替换缩略图
litpic字段:UPDATE `#@__archives` SET `litpic` = REPLACE(`litpic`, 'uploads/', 'http://img.yourdomain.com/uploads/');
- 注意:如果你的图片路径是绝对路径(如
http://yourdomain.com/uploads/...),则需要这样替换:UPDATE `#@__archives` SET `litpic` = REPLACE(`litpic`, 'http://yourdomain.com/uploads/', 'http://img.yourdomain.com/uploads/');
替换文章正文
body字段:body字段内容量大,且结构复杂,直接替换可能会有风险,建议使用更精确的替换。UPDATE `#@__archives` SET `body` = REPLACE(`body`, 'src="/uploads/', 'src="http://img.yourdomain.com/uploads/'); UPDATE `#@__archives` SET `body` = REPLACE(`body`, 'src="uploads/', 'src="http://img.yourdomain.com/uploads/'); -- 如果原路径是带域名的 UPDATE `#@__archives` SET `body` = REPLACE(`body`, 'src="http://yourdomain.com/uploads/', 'src="http://img.yourdomain.com/uploads/');
- 图集等多媒体内容:DedeCMS 的图集等内容通常存储在
body字段中,使用上面的body替换语句通常可以覆盖。
替换其他附加表:
-- 替换文章模型附加表的body UPDATE `#@__addonarticle` SET `body` = REPLACE(`body`, 'src="/uploads/', 'src="http://img.yourdomain.com/uploads/');
-
验证结果:
执行完 SQL 后,登录网站后台,更新一下缓存(系统 -> 数据库备份/恢复 -> 数据库表优化),然后前台刷新页面,检查图片是否已成功切换到二级域名。
总结与最佳实践
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 修改核心函数 | 一劳永逸,未来上传的图片自动生效,代码规范,不易出错。 | 需要修改核心文件,升级 DedeCMS 时可能需要重新修改。 | 强烈推荐,作为主要解决方案。 |
| 数据库批量替换 | 可以一次性修改历史数据,覆盖面广。 | 操作有风险(需备份数据库),可能遗漏某些字段,对大表操作较慢。 | 用于处理历史遗留数据,或作为核心函数方法的补充。 |
最佳实践流程:
- 完成第一步:确保服务器配置和二级域名访问正常。
- 执行第二步:修改
channelunit.helper.php文件,这是最关键的步骤。 - 执行第三步:登录数据库,对
#@__archives等核心表的litpic和body字段执行一次性的批量替换,以处理所有历史内容。 - 最终测试:全面检查网站首页、列表页、内容页、图集等所有涉及图片的地方,确保所有图片都从新的二级域名加载。
通过以上步骤,你就可以成功地将 DedeCMS 整站的图片调用迁移到二级域名下了。
