织梦外部链接调用不了

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

织梦为了防止恶意代码注入和提升网站安全性,默认会页(如文章、栏目页)中直接使用 <a> 标签链接到外部网站

织梦外部链接调用不了
(图片来源网络,侵删)

下面我将为您详细解释原因,并提供多种解决方案,从最简单到最彻底,您可以根据自己的需求选择。


问题根源分析

织梦的编辑器(无论是旧版的 DEDEditor 还是新版的 ckeditor)在保存内容时,会执行一个过滤函数,这个函数会检查文章内容中的标签和属性。

  • 默认过滤规则:默认情况下,织梦会过滤掉所有 target="_blank" 属性,并且会阻止或修改完整的 <a href="http://外部网址"> 链接,将其转换为站内链接或直接移除。
  • 目的:防止用户在不知情的情况下,被恶意脚本引导到外部钓鱼网站,也防止网站权重(SEO中的“权重传递”)被过多地导出到外部站点。

解决方案(按推荐顺序)

修改后台设置(最推荐,最安全)

这是最简单、最正规且最安全的解决方法,织梦官方其实提供了一个开关来控制是否允许新窗口打开链接。

  1. 登录您的织梦后台。
  2. 进入 “系统” -> “系统基本参数”
  3. 在左侧菜单中找到并点击 “核心设置”
  4. 在右侧的设置列表中,找到 “是否开启新窗口打开链接” 这个选项。
  5. 将其值从 “ N ” 修改为 “ Y ”。
  6. 点击页面底部的 “ 确定 ” 按钮保存。

效果

织梦外部链接调用不了
(图片来源网络,侵删)
  • 这样修改后,您在文章中使用 <a href="http://www.baidu.com" target="_blank">百度</a> 这样的代码,织梦将不再过滤 target="_blank" 属性。
  • 但是,这个设置主要解决的是 target="_blank" 的问题,如果外部链接仍然被替换,请尝试下面的方案二。

修改文件过滤规则(治本方法)

如果方案一无效,说明您的织梦版本可能被修改过,或者过滤规则更严格,我们需要找到并修改那个执行过滤的PHP文件。

织梦V5.7及之前版本的核心过滤文件是:/include/helpers/filter.helper.php

  1. 使用FTP或文件管理器,登录您的网站服务器,找到并下载 /include/helpers/filter.helper.php 文件到本地。

  2. 用代码编辑器(如 VS Code, Sublime Text, Dreamweaver)打开这个文件。

  3. 查找关键代码:在文件中搜索 dedecms 或者 filter_hr 等关键词,找到负责过滤 <a> 标签的代码段,通常看起来像这样:

    // 示例代码,具体行号和内容可能因版本而异
    if(!preg_match("#^http|^ftp|^file|^https|^ftps#", $href))
    {
        $href = $GLOBALS['cfg_basehost'].$href;
    }
    // 或者
    // $href = preg_replace("/(<a(.*))(target=[^>]*)/i", "\\1", $href); // 这行是移除target属性的
    // $href = preg_replace('/<a\s+.*?(href=["|\']?[^"\'\s>]+)["|\']?[^>]*>/i', '<a \\1>', $href); // 这行是规范a标签的
  4. 修改或注释代码

    • 情况A:强制转为站内链接,如果您看到类似 if(!preg_match("#^http#"...)) 的代码,它的意思是“如果不是以 http 开头的,就加上网站域名”,您可以将这个判断条件修改为允许外部链接,将 !preg_match("#^http|^ftp|..." 改为 !preg_match("#^/|^http|^ftp|...",这样以 开头的绝对路径和外部链接都能保留。
    • 情况B:直接移除过滤逻辑,最简单粗暴但有效的方法是,将整个处理外部链接的代码块用 注释掉,或者直接删除。(注意:这会降低网站安全性,请确保您信任所有内容发布者。)

    示例(注释掉一段强制转为站内链接的代码):

    // 原始代码
    if(!preg_match("#^http|^ftp|^file|^https|^ftps#", $href))
    {
        $href = $GLOBALS['cfg_basehost'].$href;
    }
    // 修改后(注释掉)
    /*
    if(!preg_match("#^http|^ftp|^file|^https|^ftps#", $href))
    {
        $href = $GLOBALS['cfg_basehost'].$href;
    }
    */
  5. 保存文件并上传:将修改后的文件重新上传到服务器,覆盖原文件。


使用自定义模型或字段(高级方法)

如果您只是想在特定的几个栏目或文章中允许外部链接,并且不希望影响全站,可以使用织梦的“自定义模型”功能。

  1. 创建自定义模型

    • 进入 “核心” -> “内容模型管理” -> “增加一个内容模型”
    • 为模型命名,外部链接文章”。
    • 在模型字段中,添加一个“单行文本”类型的字段,命名为 externallink(字段别名),并在“字段参数”中填写提示文字,如“请输入外部链接地址 (http://...)”。
  2. 创建对应栏目

    • 进入 “栏目” -> “添加栏目”
    • 在“栏目内容模型”中选择您刚刚创建的“外部链接文章”模型。
  3. 修改模板

    • 找到这个栏目使用的文章列表模板(list_article_XXX.htm)和文章内容页模板(article_XXX.htm)。
    • 在模板中,使用织梦的标签来调用这个自定义字段。
    • 列表页示例
      <a href="[field:externallink/]" target="_blank">[field:title/]</a>
    • 内容页示例
      <a href="{dede:field name='externallink'/}" target="_blank">点击访问外部链接</a>

优点:非常灵活,安全,不影响其他内容。 缺点:操作相对复杂,需要为特定内容单独创建模型和栏目。


使用插件或模块

织梦的官方或第三方市场有一些专门解决此问题的插件或模块,您可以在织梦官方论坛或相关资源网站搜索“外部链接”、“允许外链”等关键词来寻找。

优点:通常有图形化界面,操作简单。 缺点:可能需要付费,且插件的兼容性和安全性需要自行评估。


总结与建议

方案 优点 缺点 推荐度
修改后台设置 最简单、最安全、最官方 可能对某些版本或修改过的系统无效 ★★★★★
修改过滤文件 治本,一劳永逸 需要修改代码,有安全风险(操作不当) ★★★★☆
自定义模型 非常灵活、安全 操作复杂,适用于特定场景 ★★★☆☆
使用插件 操作简单,有界面 可能收费,兼容性待考 ★★☆☆☆

给您的建议

  1. 首先尝试方案一,这是最应该优先尝试的。
  2. 如果方案一无效,再尝试方案二,在修改文件前,务必先备份原文件,以防修改出错导致网站问题。
  3. 如果您的需求非常特殊,比如只在某个新闻聚合栏目大量使用外链,再考虑方案三
  4. 方案四可以作为备选,但优先级最低。

希望这些详细的步骤能帮助您解决问题!

-- 展开阅读全文 --
头像
union date结构如何正确使用与内存布局?
« 上一篇 02-26
dede如何调用当前栏目的上一级栏目标题?
下一篇 » 02-26

相关文章

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

目录[+]