织梦文章外链批量中转怎么实现高效搭建?

99ANYc3cd6
预计阅读时长 29 分钟
位置: 首页 织梦建站 正文

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

织梦文章外链批量中转
(图片来源网络,侵删)
  1. 统一管理:所有外链都在一个地方配置,修改时只需更新一处,无需修改大量文章。
  2. 统计点击:可以追踪到每个外链的点击次数,了解用户行为。
  3. 权重控制:理论上,通过中转页可以传递一部分权重(虽然效果有争议,但仍是常见做法)。
  4. 安全跳转:可以在跳转前进行一些安全检查,防止恶意链接。
  5. 美化链接:将杂乱的外链地址(如 https://example.com/article.php?id=123)美化成 https://www.yourdomain.com/go/网站名

下面我将提供几种实现方案,从简单到复杂,您可以根据自己的技术能力和需求选择。


使用织梦自带的“跳转网址”功能(最简单,无需代码)

织梦DedeCMS在发布文章时,有一个“跳转网址”的选项,这是系统自带的最基础的中转方式。

操作步骤:

  1. 登录织梦后台,进入“[核心] -> [内容频道管理] -> [添加内容频道]”。
  2. 在“频道名称”中填写一个你喜欢的名字,外链中转”。
  3. 在“频道目录”中填写 go (这将是你的中转目录,如 yourdomain.com/go/)。
  4. 在“频道列表”中选择“使用栏目列表”。
  5. 在“文章命名规则”中,可以设置为 {typedir}/{aid}.html,这样每篇文章的地址就是 yourdomain.com/go/123.html
  6. 在“列表命名规则”中可以随意设置,因为这个频道主要是用来做单页跳转的。
  7. 勾选“启用”,然后保存。

使用方法:

织梦文章外链批量中转
(图片来源网络,侵删)
  1. 在这个新建的“外链中转”频道下,创建一个文章。
  2. 在文章编辑页面,不要填写“文章内容”
  3. 在文章编辑页面下方的“跳转网址”输入框中,填入你真正想要跳转到的外链地址,https://www.baidu.com
  4. 点击“保存”。

效果:

当用户访问 yourdomain.com/go/123.html 时,织梦会自动将页面重定向到你在“跳转网址”中填写的 https://www.baidu.com

优点:

  • 无需任何代码修改,纯后台操作。
  • 管理方便,每个外链对应一篇文章。

缺点:

  • 无法批量处理:如果已经有几百上千篇文章需要添加外链,这个方法会非常繁琐。
  • 在后台文章列表里,这些外链文章会显得很杂乱。
  • 统计功能较弱,需要结合其他工具。

修改文章列表模板,实现批量外链中转(推荐)

这是最常用且最灵活的方案,通过修改文章列表模板,让所有指向特定域名的链接都经过一个中转脚本。

核心思路:

  1. 在模板中,使用织梦的{dede:field function='...' /}或自定义函数来处理文章内容中的链接。
  2. 创建一个PHP中转脚本(如 go.php),用于执行实际的跳转和统计。
  3. 修改文章内容,将外链替换为指向 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;

第二步:修改文章列表模板

  1. 进入后台“[模板] -> [默认模板管理]”。
  2. 找到你文章列表所使用的模板文件(通常是 list_article.htm)。
  3. 在模板中找到 {dede:field name='body'/}{dede:field name='description'/} 的位置,或者直接在整个模板的 <body> 标签内,添加以下织梦代码。

方法A:处理文章摘要(推荐) 在列表模板中,找到显示文章摘要的地方,通常是 {dede:list} 标签内的 field:infosfield:description,将其替换为以下代码:

{dede:list}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <p>
            <!-- 使用自定义函数处理摘要中的链接 -->
            [field:infos function='LinkReplace(@me)'/]
        </p>
    </li>
{/dede:list}

方法B:处理文章正文(适用于“相关文章”等调用正文的场景) 如果需要在调用文章正文时也进行替换,可以使用类似的方法。

第三步:创建自定义函数 LinkReplace

这个函数是核心,它负责在文章内容/摘要中查找外链并替换。

  1. 打开织梦的 include/helpers/extend.helper.php 文件。
  2. 在文件末尾的 ?> 之前,添加以下函数代码:
/**
 * 文章外链中转替换函数
 * @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批量替换功能来快速处理。

操作步骤:

  1. 登录织梦后台,进入“[系统] -> [SQL命令工具]”。

  2. 在“运行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, 编码为 %2Fhttps:// 要写成 https%3A%2F%2F
    • 你可以使用在线的URL编码工具来生成这部分。

使用方法:

  • 一次只替换一个域名,先批量替换所有 baidu.com 的链接,再替换所有 taobao.com 的链接。
  • 执行前务必备份数据库,以防万一。

这个方案可以和方案二结合使用,先通过方案三快速处理历史数据,再通过方案二自动处理新发布的内容。


总结与建议

方案 优点 缺点 适用场景
自带功能 简单,无需代码,管理直观 无法批量,后台杂乱,统计弱 外链数量极少(个位数),且未来变化不大的情况。
模板修改 功能强大,自动化,可统计点击,SEO友好 需要修改代码和模板,有一定技术门槛 强烈推荐,适合绝大多数网站,特别是有SEO需求和需要管理大量外链的场景。
数据库批量替换 速度快,能高效处理历史数据 需要手动编写SQL,容易出错,无法自动化处理新内容 配合方案二使用,用于一次性处理已发布文章中的外链。

对于你的需求“批量中转”,最佳实践是“方案二 + 方案三”的组合

  1. 使用方案二搭建好自动中转的框架(go.php + extend.helper.php)。
  2. 使用方案三的SQL命令,批量替换你网站上所有历史文章中的外链。
  3. 之后发布的新文章,外链会自动被方案二的机制处理。

这样就能一劳永逸地解决织梦文章外链的批量中转问题。

-- 展开阅读全文 --
头像
dede标签如何修改?
« 上一篇 03-04
dede文章关键字如何调用?
下一篇 » 03-04

相关文章

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

目录[+]