dede动态链接如何多站点设置?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 DEDE建站 正文

这里的“多站点设置”通常包含两种常见场景:

  1. 主站与子站/频道共享数据,但域名不同:主站是 www.a.com,有一个新闻频道是 news.a.com,它们都调用同一个数据库里的文章,但希望文章的动态链接能根据当前所在的站点自动生成对应的域名。
  2. 完全独立的多个站点,但使用同一套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的函数。

  1. 打开 /include/helpers/extend.helper.php 文件。
  2. 在文件末尾,在 ?> 之前,添加以下自定义函数:
/**
 * 获取当前站点的根目录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() 函数。

  1. 打开 /include/helpers/channelunit.helper.php 文件。
  2. 找到 GetFileUrl($aid, $typeid, $timetag, $namerule, $moresite, $siteurl, $sitepath) 函数,这个函数是生成链接的核心。
  3. 在函数内部,找到生成动态链接的 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更好地理解子站,你可以在后台进行一些配置,但这不是动态链接生效所必需的。

  1. 登录DedeCMS后台。
  2. 进入 【系统】-> 【系统基本参数】-> 【核心设置】
  3. 找到 “站点根URL” 这一项,你可以把它设置为主站的域名 http://www.a.com,因为我们通过代码已经实现了动态获取,所以这里的值不会影响我们修改后的逻辑,但保持一个默认值是好习惯。
  4. (可选)进入 【频道管理】,你可以为不同的顶级频道设置不同的“站点域名”,为“新闻”频道设置其域名为 news.a.com,虽然这对我们修改后的动态链接生成逻辑没有直接影响,但它会影响其他一些静态化或特定场景下的URL生成,是一个良好的实践。

第五步:测试

完成以上修改后,清空一下浏览器缓存,然后分别访问 www.a.comnews.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_cmspathcfg_basehost 等参数都是独立的,链接自然会生成到各自的域名下。

为什么这种场景不推荐修改核心文件? 因为每个站点的数据是隔离的,修改核心文件会让它们互相干扰,增加维护难度,且极易出错,独立安装是最稳定、最安全的方式。


总结与注意事项

场景 核心思想 修改文件 难度 推荐度
主站与子站共享数据 动态获取当前域名 extend.helper.php, channelunit.helper.php 中等 ★★★★★
完全独立的多站点 独立安装,数据隔离 无需修改 简单 ★★★★★

重要注意事项:

  1. 升级问题:这种修改属于“二次开发”,当你未来升级DedeCMS版本时,这些被修改过的文件会被新版本的文件覆盖,导致你的修改失效,每次升级后都需要重新进行修改。
  2. 性能影响:每次生成链接时,GetSiteUrl() 函数都会读取 $_SERVER 全局变量,这个操作非常轻量,对性能基本可以忽略不计。
  3. 静态化链接:如果你的网站已经开启了“静态化”(生成.html文件),那么上述方法只对动态链接(plus/view.php...)有效,静态链接的生成逻辑更复杂,通常需要配合服务器Rewrite规则来实现多站点的伪静态,通过Nginx或Apache的配置,将 news.a.com/xxx/123.html 这样的请求正确地转发到 www.a.com/plus/view.php?aid=123
  4. 谨慎操作:在修改核心文件前,一定要备份!建议在本地测试环境先调试成功,再部署到服务器上。

希望这个详细的教程能帮助你成功解决DedeCMS多站点的动态链接问题!

-- 展开阅读全文 --
头像
织梦str_replace
« 上一篇 01-02
dede修复漏洞后图片上传失败怎么办?
下一篇 » 01-02

相关文章

取消
微信二维码
支付宝二维码

目录[+]