在日常更新网站文章时,我们经常需要引用一些外部链接。然而,如果直接添加外链而不做任何处理,会导致网站辛苦积累的 SEO 权重流失;同时,在新窗口打开外链时如果缺少安全属性,还可能面临被钓鱼网站劫持的风险。
对于注重线上品牌建设和流量沉淀的企业官网而言,严格管控外链属性、保护网站自身权重是必不可少的日常 SEO 工作。
本文将详细教大家如何在 迅睿CMS (Xunrui CMS) 中,通过一段简短的代码,实现全自动为非本站链接添加 target="_blank" 以及 rel="nofollow noopener noreferrer" 属性。该方案同时有效解决了迅睿 CMS 在“批量生成静态 HTML”时容易出现的找不到函数报错问题。
为什么需要给外链添加这些属性?
在动手写代码之前,我们需要了解这些属性对 Google 和 Bing SEO 的重要性:
nofollow:明确告诉搜索引擎爬虫“不要追踪此链接,也不要传递本站的权重(Link Juice)给对方”。target="_blank":强制链接在新标签页打开,有助于降低网站的跳出率(Bounce Rate)。noopener:安全防御机制。切断新窗口与原窗口的联系,防止目标网站通过window.opener恶意篡改你的网页。noreferrer:隐私保护。阻止浏览器向目标网站发送 Referer 来源信息。
核心实现步骤(PHP自定义函数方案)
相比于使用 JavaScript 在前端动态添加,采用 PHP 在后端渲染或生成静态 HTML 时直接写入源码,是更符合搜索引擎抓取规范的 SEO 做法。
第一步:在配置文件中添加过滤函数
打开迅睿 CMS 的网站根目录,找到并编辑 config/custom.php 文件。在文件的最末尾(确保在 <?php 标签生效的范围内),添加以下代码:
// 自动给非本站的外链添加 target="_blank" 和 rel="nofollow noopener noreferrer"
if (!function_exists('dr_auto_external_link')) {
function dr_auto_external_link($content) {
// 【注意】请将下面的域名修改为你自己的核心域名(不要带 http:// 或 www)
$my_domain = '你的域名.com';
if (empty($content)) return $content;
// 使用正则表达式精准匹配文章内容中的 <a> 标签
return preg_replace_callback(
'/<a(.*?)href=["\'](.*?)["\'](.*?)>/i',
function($matches) use ($my_domain) {
$before_href = $matches[1];
$href = $matches[2];
$after_href = $matches[3];
// 判断逻辑:以 http/https 开头,且不包含你的核心域名,即判定为外链
if (preg_match('/^https?:\/\//i', $href) && strpos($href, $my_domain) === false) {
// 核心逻辑:先清除历史遗留的 target 和 rel 属性,防止代码重复或语法冲突
$before_href = preg_replace('/\s*(target|rel)=["\'][^"\']*["\']/i', '', $before_href);
$after_href = preg_replace('/\s*(target|rel)=["\'][^"\']*["\']/i', '', $after_href);
// 重新拼接标准化的 <a> 标签
return '<a' . $before_href . ' href="' . $href . '" target="_blank" rel="nofollow noopener noreferrer"' . $after_href . '>';
}
// 如果是本站内链,保持原样输出
return $matches[0];
},
$content
);
}
}
第二步:在内容模板中调用并修复静态生成 Bug
很多站长在调用自定义函数后,去后台点击“生成静态HTML”时,会遇到 Call to undefined function 的错误。这是因为迅睿 CMS 在后台离线生成静态页面的 iframe 队列任务中,为了节省内存,跳过了 config/custom.php 的加载。
有效解决方案如下:打开你的文章详情页模板(通常位于 template/pc/你的模板目录/home/show.html,如果是新闻模块则在 news/home/show.html)。
找到输出文章正文的变量(一般是 {$content}),将其替换为以下代码:
{php if (!function_exists('dr_auto_external_link')) require_once 'config/custom.php';}
{dr_auto_external_link($content)}第三步:更新缓存并生成静态页面
登录迅睿 CMS 网站后台。
点击右上角的 “更新缓存”(这一步很重要,必须让系统重新识别新增的函数配置)。
缓存更新完毕后,进入 生成 -> 生成内容静态,重新生成全站文章。
总结
通过上述三步,我们实现了全站外链权重的自动化管控,减轻了编辑人员发布文章时的繁琐工作量,同时解决了静态化生成的系统错误问题。现在,网页源码里的所有外部链接都已经具备了可靠的安全与 SEO 属性。