soarli

记录一次Typecho外链管理实战
前言早在数月前就有了严格规范soarli博客外链管理的想法,但受限于当时的时间、技术等条件一直没有开始行动。此外电...
扫描右侧二维码阅读全文
11
2022/01

记录一次Typecho外链管理实战

前言

早在数月前就有了严格规范soarli博客外链管理的想法,但受限于当时的时间、技术等条件一直没有开始行动。

此外电脑120网站正在使用Typecho默认链接管理机制。即:点击文章内的链接直接在当前页面打开,严重影响用户访问体验(用户点击外部链接出去后很难找到正在阅读的文章),近期一并加以解决。

当然可能还有大大小小的bug,欢迎大家帮忙寻找并向我反馈~

效果

soarli博客

若要严格规范外部链接的管理,面对大量的超链接,逐个手动添加跳转条件显然是不可能的,因此跳转条件需要使用Web程序对指定区域的超链接自动添加。

当然这个操作通过前后端都可以实现,但相比于jQuery动态处理DOM的解决方案,我还是更加倾向于借助后端语言完成此操作(从SEO和安全性角度考虑)。

实现效果:

  • 文章内部所有超链接的href属性都被自动加上了https://blog.soarli.top/jump/?url=前缀
  • 点击链接后会触发后端程序对于目标站点所属域名的检测机制
  • 若目标站点的域名为*.soarli.top,则直接返回302响应头给予跳转
  • 若目标站点的域名属于本站友情链接,则直接返回302响应头到友情链接跳出放行页面(如下图)

  • 若目标站点的域名不属于本站且不在友情链接列表,则直接返回302响应头到外部链接跳出确认页面(如下图)

image-20220111215102823

  • GET请求中的"url"参数并非合法的url格式,则直接返回302响应头到https://blog.soarli.top/soarli博客首页)
  • 若未设置HTTP Referer请求头或Referer信息不属于soarli博客GET请求中的"url"参数不属于*.soarli.top,则返回外链拦截页面(如下图)并通过HTTP响应头告知浏览器不要缓存此响应信息

image-20220111221443459

另一方面,针对友情链接跳出放行页面外部链接跳出确认页面

  • 若未设置HTTP Referer请求头或Referer信息不属于soarli博客,则直接返回302响应头到https://blog.soarli.top/soarli博客首页)并通过HTTP响应头告知浏览器不要缓存此响应信息
  • 页面会自动读取即将跳转的url并通过dns-prefetchprefetch等方法调用浏览器的预加载模块进行页面的预加载以加快打开速度

电脑120网站

针对文章发布页面的a标签自动添加 target="_blank" rel="nofollow",其中前者指定在新标签页面打开网页,后者则负责告诉搜索引擎拒绝为该链接分出本站的权重。

image-20220111222437052

实操

soarli博客

文章页面:

handsome/libs/Content.php

image-20220111222959332

$content = preg_replace("/<a href=\"([^\"]*)\">/i", "<a href=\"https://blog.soarli.top/jump/?url=\\1\" target=\"_blank\">", $content);

评论区:

handsome/component/comments.php

image-20220111223614962

$author = '<a href="' .'https://blog.soarli.top/jump/?url='. $comments->url . '"target="_blank"' . ' rel="external nofollow">' . $comments->author . '</a>';

电脑120网站

functions.php的添加 parseContent() 函数:

function parseContent($obj){
    $options = Typecho_Widget::widget('Widget_Options');
    if(!empty($options->src_add) && !empty($options->cdn_add)){
        $obj->content = str_ireplace($options->src_add,$options->cdn_add,$obj->content);
    }
    $obj->content = preg_replace("/<a href=\"([^\"]*)\">/i", "<a href=\"\\1\" target=\"_blank\" rel=\"nofollow\">", $obj->content);
    echo trim($obj->content);
}

image-20220111224042123

修改主题 post.php 文件,将默认的内容输出

<?php $this->content(); ?> 

改成 :

<?php parseContent($this); ?>

image-20220111224119991

参考资料:

https://www.dpaoz.com/225

https://mkblog.cn/701/

http://c.biancheng.net/view/6171.html

https://www.qian.blue/archives/typecho-URLOpenOnNewLabel.html

https://www.cnblogs.com/zdz8207/p/3773938.html

最后修改:2023 年 01 月 04 日 08 : 58 PM

发表评论