- 多站点共享数据:多个不同域名或子域名的网站(如
site1.com,site2.com)共享同一套文章、软件、商品等内容。 - 主从站模式:一个主站管理内容,多个从站同步显示内容。
- 统一后台管理:在一个后台管理所有站点的共享内容。
实现这个目标的核心思路是:修改 DedeCMS 的数据库配置文件,使其连接到同一个数据库,并确保数据表前缀正确区分,避免冲突。

下面我将分步详细讲解如何操作。
核心步骤概览
- 准备工作:确保所有站点都已安装好 DedeCMS。
- 统一数据库连接信息:修改所有站点的
data/common.inc.php文件,让它们指向同一个数据库。 - 规划数据表前缀:为每个站点设置不同的数据表前缀,这是避免数据冲突的关键。
- 导入/同步数据:将需要共享的数据从一个站点导出,并导入到其他站点(或直接操作数据库)。
- 处理跨站链接:修改模板,使内容链接能正确指向目标站点。
- 权限配置:确保 Web 服务器对
data目录有正确的读写权限。
详细操作步骤
第一步:准备工作
假设你有两个站点:
- 主站:
http://www.main-site.com(已安装并发布好内容) - 从站:
http://www.sub-site.com(已安装,但内容为空)
两个站点都安装在同一个服务器的不同目录下,
/wwwroot/main-site//wwwroot/sub-site/
第二步:统一数据库连接信息
这是最关键的一步,你需要将 sub-site.com 的数据库配置修改为与 main-site.com 一致。

-
找到配置文件:
- 打开
/wwwroot/main-site/data/common.inc.php文件,用记事本或代码编辑器打开。 - 打开
/wwwroot/sub-site/data/common.inc.php文件。
- 打开
-
复制主站的配置信息: 将
main-site.com的common.inc.php文件中的以下几行内容,完全一致地复制到sub-site.com的common.inc.php文件中,覆盖原有的内容。<?php //数据库连接信息 $cfg_dbhost = 'localhost'; // 数据库主机 $cfg_dbname = 'your_database_name'; // 数据库名 $cfg_dbuser = 'your_database_user'; // 数据库用户名 $cfg_dbpwd = 'your_database_password'; // 数据库密码 $cfg_dbprefix = 'dede_main_'; // 【重要】主站的数据表前缀 $cfg_db_language = 'gbk'; // ... 其他配置 ... ?>
注意:
$cfg_dbhost,$cfg_dbname,$cfg_dbuser,$cfg_dbpwd必须完全相同。- 此时先不要修改从站的
$cfg_dbprefix,下一步会处理。
第三步:规划并修改数据表前缀
为了防止两个站点的数据表(如 dede_archives 文章表)发生冲突,每个站点必须使用唯一的数据表前缀。
-
查看主站前缀:在
main-site.com的common.inc.php中,前缀是$cfg_dbprefix = 'dede_main_';。 -
设置从站前缀:修改
sub-site.com的common.inc.php文件,将其$cfg_dbprefix修改为一个新的、不冲突的前缀,$cfg_dbprefix = 'dede_sub_'; // 从站的数据表前缀
-
修改从站所有表名: 你需要登录你的数据库管理工具(如 phpMyAdmin),将
sub-site.com在数据库中所有表的表名前缀从默认的dede_修改为dede_sub_。- 将
dede_archives改为dede_sub_archives。 - 将
dede_arctype改为dede_sub_arctype。 - ... 以此类推,修改所有属于
sub-site.com的数据表。
操作技巧:在 phpMyAdmin 中,你可以使用 SQL 语句批量重命名,非常高效:
RENAME TABLE `dede_archives` TO `dede_sub_archives`; RENAME TABLE `dede_arctype` TO `dede_sub_arctype`; RENAME TABLE `dede_addonarticle` TO `dede_sub_addonarticle`; -- ... 为每个需要修改的表执行一次 ...
- 将
完成这一步后,两个站点就连接到了同一个数据库,但各自使用独立的数据表,互不干扰。
第四步:导入/同步数据
你需要将 main-site.com 的复制到 sub-site.com 对应的数据表中。
-
共享哪些表? 通常共享的表包括:
archives(文章主表)arctype(栏目表)addonarticle/addonsoft/addonproduct等文章/软件/商品附表。keyword(关键词表)tagindex/taglist(TAG标签表)
-
如何同步?
-
直接操作数据库(推荐) a. 在 phpMyAdmin 中,先为
your_database_name数据库备份数份,以防操作失误。 b. 从main-site.com的数据表(如dede_main_archives)中导出需要的数据。 c. 将导出的数据导入到sub-site.com的数据表(如dede_sub_archives)中。- 注意:如果直接复制数据,
arctype表中的typedir(栏目路径) 和archives表中的arcurl(文章链接) 字段会包含主站的域名,需要后续通过模板或SQL批量替换。
- 注意:如果直接复制数据,
-
使用DedeCMS后台(仅适用于少量数据) 你可以在主站后台“内容” -> “一键更新网站”,然后从站后台“内容” -> “导入内容”,但这种方法通常不够灵活,容易出错,不推荐用于大量数据同步。
-
第五步:处理跨站链接(非常重要!)
由于你直接复制了数据,sub-site.com 的文章和栏目链接可能仍然指向 main-site.com,你必须修正这个问题。
-
批量替换数据库: 在 phpMyAdmin 中,使用 SQL 的
UPDATE和REPLACE函数批量替换sub-site.com相关表中的 URL。-- 替换栏目路径 UPDATE `dede_sub_arctype` SET `typedir` = REPLACE(`typedir`, 'http://www.main-site.com', 'http://www.sub-site.com'); -- 替换文章链接 UPDATE `dede_sub_archives` SET `arcurl` = REPLACE(`arcurl`, 'http://www.main-site.com', 'http://www.sub-site.com'); -- 如果文章有副表,也需要替换 UPDATE `dede_sub_addonarticle` SET `body` = REPLACE(`body`, 'http://www.main-site.com', 'http://www.sub-site.com');
-
使用绝对路径的模板(更推荐的方法) 为了从根本上解决这个问题,最好的方法是修改模板,使其使用
{dede:global.cfg_basehost/}这个全局变量来生成绝对路径。- 检查你的模板文件(在
/templets/目录下)。 - 确保所有链接都使用了 DedeCMS 的全局变量,而不是硬编码的域名。
- 在
article_article.htm模板中,文章的链接应该是:<a href="{dede:field name='arcurl'/}">{dede:field name='title'/}</a>DedeCMS 在解析时会自动将
arcurl替换为完整的、基于当前站点的 URL,只要你正确配置了sub-site.com的站点信息(在后台“系统” -> “系统基本参数” -> “站点设置”中),它就会自动生成正确的链接。
- 检查你的模板文件(在
第六步:权限配置
确保 Web 服务器(如 Apache 或 Nginx)对 data 目录具有读写权限,这个目录存储了配置文件和缓存文件,权限错误会导致网站无法正常运行。
重要注意事项和进阶技巧
- 附件和图片路径:如果站点间共享附件和图片,并且它们存储在服务器上,也需要注意路径问题,建议将附件上传目录放在站点根目录之外,或者使用相对路径/绝对路径的配置。
- 会员系统:如果需要共享会员,除了共享
member表前缀相关的表,还需要确保dede_member和dede_member_tpl等表的表前缀也一致,并且会员中心的模板路径也要正确。 - 插件和模块:如果使用了插件,请确保插件在两个站点上都已安装并启用,且插件相关的数据表也遵循了相同的“公用”或“独立”原则。
- 性能考虑:所有站点都读写同一个数据库,会增加数据库服务器的负载,对于高流量网站,需要考虑数据库的优化和主从复制架构。
- 安全:确保数据库用户权限最小化,不要使用
root用户。data目录的权限设置要严格,最好禁止外部访问(例如通过.htaccess文件)。
通过以上步骤,你就可以成功地在多个 DedeCMS 站点之间实现数据库的公用,从而高效地管理和共享内容。
