这里的“多站点设置”通常包含两种常见场景:
- 主站与子站/频道共享数据,但域名不同:主站是
www.a.com,有一个新闻频道是news.a.com,它们都调用同一个数据库里的文章,但希望文章的动态链接能根据当前所在的站点自动生成对应的域名。 - 完全独立的多个站点,但使用同一套DedeCMS程序:这种情况比较少见,通常每个站点都有自己的独立安装。
我们将重点讲解第一种场景,因为它是最常见且最有价值的,核心思想是:让系统在生成链接时,能自动识别当前访问的域名,并使用该域名来构建链接。
主站与子站共享数据,动态链接自动适配域名
假设我们有以下结构:
- 主站域名:
www.a.com - 新闻子站域名:
news.a.com - 两个站点都指向同一套DedeCMS程序和同一个数据库。
我们的目标是:在 news.a.com 上浏览文章时,文章的链接(如 [field:arcurl/])自动生成 news.a.com/plus/view.php?aid=xxx,而不是 www.a.com/plus/view.php?aid=xxx。
实现步骤
这个方法的核心是修改DedeCMS的核心文件,让它动态获取当前请求的域名,而不是写死在配置里。
第一步:备份原始文件
在进行任何修改之前,请务必备份以下文件,以防出错无法恢复:
/include/helpers/extend.helper.php/include/helpers/channelunit.helper.php
第二步:修改 extend.helper.php 文件
这个文件是存放各种辅助函数的地方,我们在这里添加一个获取当前站点根目录URL的函数。
- 打开
/include/helpers/extend.helper.php文件。 - 在文件末尾,在
?>之前,添加以下自定义函数:
/**
* 获取当前站点的根目录URL
* 用于多站点环境下,动态生成正确的链接
*
* @return string 当前站点的URL,'http://www.a.com' 或 'http://news.a.com'
*/
function GetSiteUrl()
{
// 如果开启了HTTPS,则使用 'https://',否则使用 'http://'
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
// 获取当前访问的域名
$domain = $_SERVER['HTTP_HOST'];
// 拼接成完整的站点URL
$siteUrl = $protocol . $domain;
return $siteUrl;
}
第三步:修改 channelunit.helper.php 文件
这个文件负责处理频道和内容的各种URL,我们需要修改其中生成动态链接的函数,让它调用我们刚刚创建的 GetSiteUrl() 函数。
- 打开
/include/helpers/channelunit.helper.php文件。 - 找到
GetFileUrl($aid, $typeid, $timetag, $namerule, $moresite, $siteurl, $sitepath)函数,这个函数是生成链接的核心。 - 在函数内部,找到生成动态链接的
if判断块,它通常看起来像这样:
// 在 channelunit.helper.php 中找到类似下面的代码块
if($moresite>0)
{
// ... 其他逻辑 ...
}
else
{
// 这是我们要修改的重点部分
if($cfg_rewrite == 'Y')
{
// ... 重写规则逻辑 ...
}
else
{
$reurl = $cfg_phpurl."/view.php?aid=$aid";
}
}
我们需要修改 else 分支下的 $reurl 赋值语句,将硬编码的 $cfg_phpurl 替换为动态获取的站点URL。
修改如下:
将原来的:
else
{
$reurl = $cfg_phpurl."/view.php?aid=$aid";
}
修改为:
else
{
// 调用我们自定义的函数获取当前站点URL
$current_site_url = GetSiteUrl();
// 拼接动态链接
$reurl = $current_site_url . "/". $cfg_phpurl ."/view.php?aid=$aid";
}
第四步:配置子站域名(可选但推荐)
为了让DedeCMS更好地理解子站,你可以在后台进行一些配置,但这不是动态链接生效所必需的。
- 登录DedeCMS后台。
- 进入 【系统】-> 【系统基本参数】-> 【核心设置】。
- 找到 “站点根URL” 这一项,你可以把它设置为主站的域名
http://www.a.com,因为我们通过代码已经实现了动态获取,所以这里的值不会影响我们修改后的逻辑,但保持一个默认值是好习惯。 - (可选)进入 【频道管理】,你可以为不同的顶级频道设置不同的“站点域名”,为“新闻”频道设置其域名为
news.a.com,虽然这对我们修改后的动态链接生成逻辑没有直接影响,但它会影响其他一些静态化或特定场景下的URL生成,是一个良好的实践。
第五步:测试
完成以上修改后,清空一下浏览器缓存,然后分别访问 www.a.com 和 news.a.com 上的任意一篇文章。
- 在
www.a.com的文章页,查看源码,文章链接应该是http://www.a.com/plus/view.php?aid=xxx。 - 在
news.a.com的文章页,查看源码,文章链接应该是http://news.a.com/plus/view.php?aid=xxx。
如果结果符合预期,那么恭喜你,多站点的动态链接设置成功了!
完全独立的多个站点(不推荐,但说明)
如果你有多个完全独立、数据不共享的站点,每个站点都有自己的数据库,那么你不需要做任何特殊的“动态链接设置”。
正确的做法是:为每个站点单独安装一套DedeCMS程序。
- 站点A:
www.a.com-> 安装在/www/a/目录下。 - 站点B:
www.b.com-> 安装在/www/b/目录下。
这样,每个站点都有自己的配置文件 (data/common.inc.php),里面的 cfg_cmspath 和 cfg_basehost 等参数都是独立的,链接自然会生成到各自的域名下。
为什么这种场景不推荐修改核心文件? 因为每个站点的数据是隔离的,修改核心文件会让它们互相干扰,增加维护难度,且极易出错,独立安装是最稳定、最安全的方式。
总结与注意事项
| 场景 | 核心思想 | 修改文件 | 难度 | 推荐度 |
|---|---|---|---|---|
| 主站与子站共享数据 | 动态获取当前域名 | extend.helper.php, channelunit.helper.php |
中等 | ★★★★★ |
| 完全独立的多站点 | 独立安装,数据隔离 | 无需修改 | 简单 | ★★★★★ |
重要注意事项:
- 升级问题:这种修改属于“二次开发”,当你未来升级DedeCMS版本时,这些被修改过的文件会被新版本的文件覆盖,导致你的修改失效,每次升级后都需要重新进行修改。
- 性能影响:每次生成链接时,
GetSiteUrl()函数都会读取$_SERVER全局变量,这个操作非常轻量,对性能基本可以忽略不计。 - 静态化链接:如果你的网站已经开启了“静态化”(生成
.html文件),那么上述方法只对动态链接(plus/view.php...)有效,静态链接的生成逻辑更复杂,通常需要配合服务器Rewrite规则来实现多站点的伪静态,通过Nginx或Apache的配置,将news.a.com/xxx/123.html这样的请求正确地转发到www.a.com/plus/view.php?aid=123。 - 谨慎操作:在修改核心文件前,一定要备份!建议在本地测试环境先调试成功,再部署到服务器上。
希望这个详细的教程能帮助你成功解决DedeCMS多站点的动态链接问题!
