核心原理:DedeCMS 城市分站的实现方式
DedeCMS 实现城市分站主要有两种主流方式,各有优劣:
单数据库,多站点(推荐)
这是最常用、最灵活、维护成本最低的方式。
-
工作原理:
- 一个数据库:所有城市分站都共享同一个数据库。
- 多表前缀:为每个城市分站创建独立的数据表,但通过不同的表前缀来区分。
- 主站:
dede_archives(文章主表) - 北京分站:
dede_archives_beijing - 上海分站:
dede_archives_shanghai
- 主站:
- 独立栏目:每个分站拥有自己独立的栏目和文章。
- 模板分离:每个分站拥有自己独立的模板文件,存放在不同的目录下。
- 独立配置:通过修改
include/config_base.php文件中的数据库表前缀变量$cfg_dbprefix,来动态连接对应城市的数据表。
-
优点:
- 维护方便:所有站点在一个后台管理,升级、备份数据库都非常方便。
- 资源占用低:只有一个数据库实例,服务器资源消耗相对较少。
- 扩展性强:增加新城市非常简单,只需复制一套表并修改前缀即可。
-
缺点:
- 数据隔离性稍差:所有数据都在一个库里,需要规范操作。
- 配置稍复杂:需要动态修改配置文件来切换站点。
多数据库,多站点
这种方式适用于数据量极大、对性能和隔离性要求极高的场景。
-
工作原理:
- 多个数据库:每个城市分站使用一个独立的数据库。
dede_main(主站数据库)dede_beijing(北京分站数据库)dede_shanghai(上海分站数据库)
- 独立配置:每个分站都有一套独立的 DedeCMS 程序和
config_base.php文件,配置文件中指向各自的数据库。
- 多个数据库:每个城市分站使用一个独立的数据库。
-
优点:
- 数据隔离性好:一个数据库的问题不会影响其他站点。
- 性能高:数据库压力分散到多个实例上。
-
缺点:
- 维护成本高:N 个站点就有 N 套程序和 N 个数据库,升级、备份极其繁琐。
- 资源占用高:需要多个数据库实例。
- 不适合中小型网站。
对于绝大多数用户,强烈推荐使用【方式一:单数据库,多站点】。 接下来的所有步骤都将围绕此方式展开。
详细操作步骤(单数据库,多站点模式)
假设我们要创建一个主站 www.example.com 和两个分站 beijing.example.com 和 shanghai.example.com。
第 1 步:环境准备
- 域名解析:确保你的域名已经解析到服务器。
A记录:www.example.com-> 服务器IPA记录:beijing.example.com-> 服务器IPA记录:shanghai.example.com-> 服务器IP
- 服务器配置:在服务器上为每个域名创建一个虚拟主机(Nginx 或 Apache),指向 DedeCMS 程序的不同目录。
- 主站:
/wwwroot/ - 北京分站:
/wwwroot/beijing/ - 上海分站:
/wwwroot/shanghai/ - 这些目录下,可以先只放一个
index.php文件,后面会通过配置让它们指向同一个程序目录。
- 主站:
第 2 步:安装并配置主站
- 安装 DedeCMS:在
/wwwroot/目录下正常安装 DedeCMS,并完成初始配置。 - 创建分站数据表:
- 登录你的数据库管理工具(如 phpMyAdmin)。
- 找到主站的数据库(
dede_main)。 - 选择
dede_archives表,点击“复制表结构”(注意:不要复制数据)。 - 将新表重命名为
dede_archives_beijing。 - 重复此操作,为上海分站创建
dede_archives_shanghai。 - 注意:你还需要为每个分站复制其他核心表,如:
dede_arctype(栏目表)dede_addonarticle(文章附加表,如果你使用了文章模型)dede_channeltype(频道类型表)- ...等等,根据你使用的模型来决定。
- 创建分站栏目和内容:
- 登录 DedeCMS 后台。
- 手动为每个分站创建栏目和发布内容,在北京分站的栏目下发布北京相关的文章,在上海分站的栏目下发布上海相关的文章,这是最关键的一步,确保每个分站的内容是独立的。
第 3 步:创建分站目录和入口文件
-
创建目录:在
/wwwroot/下创建beijing和shanghai目录。 -
创建入口文件:
- 在
/wwwroot/beijing/目录下创建index.php文件。 - 在
/wwwroot/shanghai/目录下创建index.php文件。 - 这两个
index.php的内容完全相同,内容如下:
<?php // 定义当前分站的标识 define('CITY_NAME', 'beijing'); // 这里是关键,北京站是 'beijing',上海站就要改成 'shanghai' // 路径常量定义 define('DEDEROOT', dirname(__FILE__) . '/..'); // 指向主站根目录 define('DEDEDATA', DEDEROOT . '/data'); // 引入主站的核心配置文件 require_once DEDEROOT . '/include/config_base.php'; // 动态修改数据库表前缀 // 主站的前缀是 'dede_',北京站是 'dede_beijing_' $cfg_dbprefix = $cfg_dbprefix . CITY_NAME . '_'; // 引入前台入口文件 require_once DEDEROOT . '/index.php'; ?>解释:
define('CITY_NAME', 'beijing');:这是分站的“身份证”,我们用它来动态拼接表前缀。define('DEDEROOT', dirname(__FILE__) . '/..');:让分站程序能找到主站的核心文件。$cfg_dbprefix = $cfg_dbprefix . CITY_NAME . '_';:这是最核心的一行代码,它将原来的表前缀(如dede_)和城市名(如beijing)拼接成新的表前缀(dede_beijing_),从而让程序连接到对应城市的数据库表。
- 在
第 4 步:配置虚拟主机
以 Nginx 为例,修改你的 Nginx 配置文件 (nginx.conf 或站点配置文件):
# 主站配置
server {
listen 80;
server_name www.example.com;
root /wwwroot;
index index.php index.html;
# ... 其他配置
}
# 北京分站配置
server {
listen 80;
server_name beijing.example.com;
root /wwwroot/beijing; # 指向分站目录
index index.php;
# 关键:将所有请求都交给上面的 index.php 处理
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# ... PHP-FPM 配置等
}
# 上海分站配置
server {
listen 80;
server_name shanghai.example.com;
root /wwwroot/shanghai; # 指向分站目录
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# ... PHP-FPM 配置等
}
重启 Nginx 服务后,访问 beijing.example.com 和 shanghai.example.com,就应该能看到各自独立的内容了。
高级技巧与优化
(如头部、底部、导航)
如果希望所有分站共享某些部分(如网站头部 header.htm 和底部 footer.htm),可以将这些模板文件放在主站的 templets/default/ 目录下,然后在分站的模板中通过绝对路径引用。
在分站模板 index.htm 中:
{dede:include filename="/wwwroot/templets/default/header.htm"/}
<!-- 分站特有内容 -->
{dede:include filename="/wwwroot/templets/default/footer.htm"/}
动态切换城市
可以做一个城市选择器,让用户在主站或某个页面点击切换城市,然后通过 SESSION 或 Cookie 记录当前选择的城市,动态修改 CITY_NAME 的值,实现无刷新切换城市站点。
URL 伪静态优化
为了让分站的 URL 更美观,可以为每个分站单独配置伪静态规则,北京分站的 URL 可以是 beijing.example.com/news/123.html,这需要在 DedeCMS 后台的“系统”->“系统基本参数”->“核心设置”中为每个分站分别配置。
内容同步(如果需要)
如果主站有某些内容(如公司新闻、行业资讯)需要同步到所有分站,可以:
- 手动复制:最简单但效率低。
- 开发同步插件:开发一个插件,在主站发布内容时,通过钩子将内容复制到所有分站的对应栏目。
- 使用数据库脚本:编写 SQL 脚本,定时将主站的数据插入到各分站的表中。
注意事项与常见问题
- 数据表前缀必须规范:确保为每个分站创建的表前缀是唯一的且符合
原前缀+城市名+下划线的格式,否则index.php中的$cfg_dbprefix修改会失效。 - 权限问题:确保 Web 服务器(如 Nginx, Apache)对
/wwwroot/data目录有读写权限,因为配置文件和缓存都在这里。 - 插件兼容性:某些第三方插件可能依赖于固定的表名,在多站点模式下可能会出问题,使用前需要充分测试。
- 性能考虑:当城市分站数量非常多时(几十上百个),每次请求都要重新拼接
$cfg_dbprefix,可能会有微小的性能开销,但对于几百个站点以内的规模,影响可以忽略不计。 - 安全:确保你的
data目录和config_base.php文件的安全性,防止被恶意篡改。
通过以上步骤,你就可以成功地用 DedeCMS 搭建一个功能完善、易于维护的城市分站系统了,这个过程虽然步骤较多,但理清了逻辑后,每一步都是清晰明确的。
