这是一个非常常见的需求,尤其是在SEO优化中,通过一个中转页面,我们可以统一管理所有外链,实现以下目的:

- 统一管理:所有外链都在一个地方配置,修改时只需更新一处,无需修改大量文章。
- 统计点击:可以追踪到每个外链的点击次数,了解用户行为。
- 权重控制:理论上,通过中转页可以传递一部分权重(虽然效果有争议,但仍是常见做法)。
- 安全跳转:可以在跳转前进行一些安全检查,防止恶意链接。
- 美化链接:将杂乱的外链地址(如
https://example.com/article.php?id=123)美化成https://www.yourdomain.com/go/网站名。
下面我将提供几种实现方案,从简单到复杂,您可以根据自己的技术能力和需求选择。
使用织梦自带的“跳转网址”功能(最简单,无需代码)
织梦DedeCMS在发布文章时,有一个“跳转网址”的选项,这是系统自带的最基础的中转方式。
操作步骤:
- 登录织梦后台,进入“[核心] -> [内容频道管理] -> [添加内容频道]”。
- 在“频道名称”中填写一个你喜欢的名字,外链中转”。
- 在“频道目录”中填写
go(这将是你的中转目录,如yourdomain.com/go/)。 - 在“频道列表”中选择“使用栏目列表”。
- 在“文章命名规则”中,可以设置为
{typedir}/{aid}.html,这样每篇文章的地址就是yourdomain.com/go/123.html。 - 在“列表命名规则”中可以随意设置,因为这个频道主要是用来做单页跳转的。
- 勾选“启用”,然后保存。
使用方法:

- 在这个新建的“外链中转”频道下,创建一个文章。
- 在文章编辑页面,不要填写“文章内容”。
- 在文章编辑页面下方的“跳转网址”输入框中,填入你真正想要跳转到的外链地址,
https://www.baidu.com。 - 点击“保存”。
效果:
当用户访问 yourdomain.com/go/123.html 时,织梦会自动将页面重定向到你在“跳转网址”中填写的 https://www.baidu.com。
优点:
- 无需任何代码修改,纯后台操作。
- 管理方便,每个外链对应一篇文章。
缺点:
- 无法批量处理:如果已经有几百上千篇文章需要添加外链,这个方法会非常繁琐。
- 在后台文章列表里,这些外链文章会显得很杂乱。
- 统计功能较弱,需要结合其他工具。
修改文章列表模板,实现批量外链中转(推荐)
这是最常用且最灵活的方案,通过修改文章列表模板,让所有指向特定域名的链接都经过一个中转脚本。
核心思路:
- 在模板中,使用织梦的
{dede:field function='...' /}或自定义函数来处理文章内容中的链接。 - 创建一个PHP中转脚本(如
go.php),用于执行实际的跳转和统计。 - 修改文章内容,将外链替换为指向
go.php的链接。
第一步:创建中转脚本 go.php
在网站根目录下,创建一个名为 go.php 的文件,并粘贴以下代码:
<?php
/**
* 织梦DedeCMS外链中转脚本
*/
// 安全检查,防止直接访问
if (!isset($_GET['url'])) {
header("HTTP/1.0 404 Not Found");
echo 'Error: URL parameter is missing.';
exit();
}
// 获取要跳转的URL
$targetUrl = trim($_GET['url']);
// 安全过滤:防止本地跳转和恶意脚本
if (empty($targetUrl) || strpos($targetUrl, 'http') !== 0 || strpos($targetUrl, $_SERVER['HTTP_HOST']) !== false) {
header("HTTP/1.0 404 Not Found");
echo 'Error: Invalid or forbidden URL.';
exit();
}
// (可选) 数据库统计点击次数
// 需要先在 dede_archives 表中增加一个 click_count 字段
if ($GLOBALS['cfg_dbhost'] && $targetUrl) {
$urlHash = md5($targetUrl); // 使用URL的MD5值作为唯一标识
$dsql = new DedeSql(false);
// 检查记录是否存在,不存在则插入
$dsql->Execute("SELECT click_count FROM `#@__link_clicks` WHERE url_hash='$urlHash'");
if ($dsql->GetTotalRow() == 0) {
$dsql->ExecuteNoneQuery("INSERT INTO `#@__link_clicks` (url_hash, url, click_count) VALUES ('$urlHash', '$targetUrl', 1);");
} else {
// 记录存在,则点击数+1
$dsql->ExecuteNoneQuery("UPDATE `#@__link_clicks` SET click_count = click_count + 1 WHERE url_hash='$urlHash';");
}
$dsql->Close();
}
// 执行301跳转(推荐,对SEO友好)
header("HTTP/1.1 301 Moved Permanently");
header("Location: " . $targetUrl);
// 或者执行302跳转(临时跳转)
// header("Location: " . $targetUrl);
exit();
?>
使用说明:
- 将上述代码保存为
go.php,上传到网站根目录。 - (可选)数据库统计:如果你想统计点击次数,需要执行以下SQL在
dede_archives所在的数据库中创建一个新表:CREATE TABLE `dede_link_clicks` ( `id` int(11) NOT NULL AUTO_INCREMENT, `url_hash` char(32) NOT NULL COMMENT 'URL的MD5值', `url` text NOT NULL COMMENT '原始URL', `click_count` int(10) NOT NULL DEFAULT '0' COMMENT '点击次数', `last_click_time` int(10) NOT NULL DEFAULT '0' COMMENT '最后点击时间', PRIMARY KEY (`id`), UNIQUE KEY `url_hash` (`url_hash`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
第二步:修改文章列表模板
- 进入后台“[模板] -> [默认模板管理]”。
- 找到你文章列表所使用的模板文件(通常是
list_article.htm)。 - 在模板中找到
{dede:field name='body'/}或{dede:field name='description'/}的位置,或者直接在整个模板的<body>标签内,添加以下织梦代码。
方法A:处理文章摘要(推荐)
在列表模板中,找到显示文章摘要的地方,通常是 {dede:list} 标签内的 field:infos 或 field:description,将其替换为以下代码:
{dede:list}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
<p>
<!-- 使用自定义函数处理摘要中的链接 -->
[field:infos function='LinkReplace(@me)'/]
</p>
</li>
{/dede:list}
方法B:处理文章正文(适用于“相关文章”等调用正文的场景) 如果需要在调用文章正文时也进行替换,可以使用类似的方法。
第三步:创建自定义函数 LinkReplace
这个函数是核心,它负责在文章内容/摘要中查找外链并替换。
- 打开织梦的
include/helpers/extend.helper.php文件。 - 在文件末尾的
?>之前,添加以下函数代码:
/**
* 文章外链中转替换函数
* @param string $body 文章内容或摘要
* @return string 处理后的内容,外链被替换为中转链接
*/
if (!function_exists('LinkReplace')) {
function LinkReplace($body) {
// 1. 定义允许跳转的域名白名单(可选,增加安全性)
// $allowed_domains = array('baidu.com', 'taobao.com', 'jd.com');
// 2. 定义中转脚本URL
$go_script_url = '/go.php?url=';
// 3. 使用正则表达式匹配所有 <a> 标签的 href 属性
// 这个正则会匹配所有 <a> 标签,并捕获 href 的值
$pattern = '/<a\s+[^>]*href=(["\'])([^"\']*)\1[^>]*>/i';
// 4. 定义回调函数,用于替换匹配到的链接
$replacement = function($matches) use ($go_script_url) {
$full_tag = $matches[0]; // 完整的 <a> 标签
$href = $matches[2]; // href 的值
// 5. 判断是否是需要中转的外链
// a) 排除站内链接(根据你的域名修改)
$site_domain = 'yourdomain.com'; // <--- !!! 重要:请替换成你自己的域名 !!!
if (strpos($href, $site_domain) !== false) {
return $full_tag; // 是站内链接,不处理,直接返回原标签
}
// b) 排除以 # 开头的锚点链接
if (strpos($href, '#') === 0) {
return $full_tag;
}
// c) (可选) 检查是否在白名单中,不在则中转
/*
$is_allowed = false;
foreach ($allowed_domains as $domain) {
if (strpos($href, $domain) !== false) {
$is_allowed = true;
break;
}
}
if (!$is_allowed) {
// ... 中转逻辑 ...
} else {
return $full_tag;
}
*/
// 6. 如果是外链,则进行替换
$new_href = $go_script_url . urlencode($href);
// 返回修改后的 <a> 标签
return str_replace($matches[2], $new_href, $full_tag);
};
// 7. 执行正则替换
return preg_replace_callback($pattern, $replacement, $body);
}
}
使用说明:
- 务必修改
$site_domain:将yourdomain.com替换成你自己的网站域名,这是判断站内/外链的关键。 - 这个函数会遍历所有
<a>标签,如果不是站内链接,就会将其href属性的值替换为/go.php?url=原始URL。
第四步:更新缓存
在后台点击“[系统] -> [一键更新网站] -> [更新HTML]”,更新一下网站,使新模板生效。
效果:
当你访问文章列表页时,所有文章摘要中的外链都会自动变成指向 yourdomain.com/go.php?url=... 的链接,用户点击后,会先经过 go.php,然后被重定向到目标网站,并且点击数会被记录(如果你开启了数据库统计功能)。
使用数据库批量替换(适用于已有大量文章)
如果你已经发布了很多文章,并且文章内容里直接包含了外链,可以使用织梦的SQL批量替换功能来快速处理。
操作步骤:
-
登录织梦后台,进入“[系统] -> [SQL命令工具]”。
-
在“运行SQL语句”的文本框中,输入以下命令:
UPDATE dede_archives SET body = REPLACE(body, 'https://www.old-link.com', '/go.php?url=https%3A%2F%2Fwww.old-link.com');
命令解析:
UPDATE dede_archives SET body = ...:表示要更新dede_archives表中的body字段(文章内容)。REPLACE(body, '旧字符串', '新字符串'):这是MySQL的替换函数。'https://www.old-link.com':这是你要被替换的原始外链,你需要把它替换成你想要批量替换的真实外链。'/go.php?url=https%3A%2F%2Fwww.old-link.com':这是替换成的新链接。- 注意:URL中的特殊字符(如 和 )需要进行URL编码。 编码为
%3A, 编码为%2F。https://要写成https%3A%2F%2F。 - 你可以使用在线的URL编码工具来生成这部分。
- 注意:URL中的特殊字符(如 和 )需要进行URL编码。 编码为
使用方法:
- 一次只替换一个域名,先批量替换所有
baidu.com的链接,再替换所有taobao.com的链接。 - 执行前务必备份数据库,以防万一。
这个方案可以和方案二结合使用,先通过方案三快速处理历史数据,再通过方案二自动处理新发布的内容。
总结与建议
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 自带功能 | 简单,无需代码,管理直观 | 无法批量,后台杂乱,统计弱 | 外链数量极少(个位数),且未来变化不大的情况。 |
| 模板修改 | 功能强大,自动化,可统计点击,SEO友好 | 需要修改代码和模板,有一定技术门槛 | 强烈推荐,适合绝大多数网站,特别是有SEO需求和需要管理大量外链的场景。 |
| 数据库批量替换 | 速度快,能高效处理历史数据 | 需要手动编写SQL,容易出错,无法自动化处理新内容 | 配合方案二使用,用于一次性处理已发布文章中的外链。 |
对于你的需求“批量中转”,最佳实践是“方案二 + 方案三”的组合:
- 使用方案二搭建好自动中转的框架(
go.php+extend.helper.php)。 - 使用方案三的SQL命令,批量替换你网站上所有历史文章中的外链。
- 之后发布的新文章,外链会自动被方案二的机制处理。
这样就能一劳永逸地解决织梦文章外链的批量中转问题。
