给Hexo网站添加跳转安全提醒界面

给Hexo网站添加跳转安全提醒界面
老刘博客在前一段时间,偶然间发现一篇文章,文章大意就是关于给Hexo博客给文章外部超链接增加中间跳转询问页面,当时看到之后惊为天人之作,毕竟这种界面对于提升博客自身的浏览粘度还是非常重要的,因此把文章就转载过来,做了一个标记,可是个人能力有限,实在不清楚是哪里做修改,所以搁置了。今天又看到一篇文章,同样是介绍博客外部链接增加中间跳转询问页面的,而且作者做成了插件,我测试了一下,非常棒,转载给大家。先来看白天模式的跳转界面
再来看夜间模式的跳转界面
原作者的碎碎念我们不再记录,重点是插件的使用,下面一步一步的跟随老博客站长,来安装这款非常棒的Hexo文章跳转安全提醒插件hexo-safego
吧!
插件安装:
在使用该插件之前,需要先安装 cheerio
,cheerio
是一个轻量级的库,用于在服务器端快速、灵活地实现 jQuery
核心功能。在 hexo-safego
插件中,cheerio
被用来解析和操作生成的静态 HTML
内容,类似于在浏览器中使用 jQuery
处理 DOM
元素。这使得插件能够在生成静态页面时,处理和替换外部链接,增强博客的安全性,而不需要在客户端引入 jQuery
。Hexo 一般都有这个插件,可以在 node_modules 查看,如果没有,请先执行:
1 | npm install cheerio --save |
一般情况下,这款插件一般都已经安装好,只需要查看一下是否存在就可以,然后是安装hexo-safego
插件
1 | npm install hexo-safego --save |
到这里,插件的安装就完成了,下面来看插件配置。
配置插件:
在hexo根目录的_config.yml文件中添加以下配置:
1 | # hexo-safego安全跳转插件 |
配置项说明:
原作者说添加好配置之后,使用Hexo博客的三件套就可以正常运行测试了,但我感觉还是需要适当的提前配置一下,你可以配置相关配置项对你的博客进行适配,下面是每个配置项的说明
enable : Boolean, 默认值: false, 描述: 是否启用 hexo-safego 插件。
enable_base64_encode : Boolean, 默认值: true, 描述: 是否对跳转链接进行 Base64 编码,如上面展示图像所示,如果关闭,则不对参数进行处理,直接放置目标路径。
enable_target_blank : Boolean, 默认值: true, 描述: 是否在跳转链接中添加 target=”_blank” 属性,在新页面跳转。
url_param_name : String, 默认值: “u”, 描述: 跳转页面的 URL 参数名称,可自行定义。
html_file_name : String, 默认值: “go.html”, 描述: 生成的跳转页面文件名。
ignore_attrs : Array, 默认值: [‘data-fancybox’], 描述: 需要忽略的链接属性列表,这里默认忽略灯箱,如果你有其他需要忽略的可以继续添加。
apply_containers : Array, 默认值: [‘#article-container’], 描述: 指定要处理的容器列表,这里默认为butterfly文章部分。
domain_whitelist : Array, 默认值: [], 描述: 域名白名单列表,使用字符串匹配,如果跳转链接中包含该字符串,则忽略。
apply_pages : Array, 默认值: [‘/posts/‘], 描述: 生效页面路径列表。
avatar : String, 默认值: “https://fastly.jsdelivr.net/gh/willow-god/hexo-safego@latest/lib/avatar.png“, 描述: 跳转页面的头像图片链接,可以使用相对地址。
title : String, 默认值: “网站名称”, 描述: 跳转页面的标题。
subtitle : String, 默认值: “网站副标题”, 描述: 跳转页面的副标题。
darkmode : Boolean, 默认值: false, 描述: 是否启用夜间模式。
debug : Boolean, 默认值: false, 描述: 是否启用调试模式,开启后会输出详细的调试信息。
我自己的配置:
关于文件配置,我只是关注了五个地方
白名单列表,把里面的域名设置成自己的域名
1
2domain_whitelist: # 域名白名单列表,包含白名单中的域名的链接将被忽略
- 'qyliu.top'生效页面路径
1
2apply_pages: # 生效页面路径列表,只有在这些页面上才会对链接进行处理
- '/posts/'我自己的网站是
articles
,在原作者这里是posts
,我自己做了调整。头像问题
1
avatar: /info/avatar.ico # 头像图片链接
这里是头像链接设置,需要调整好,不然不会显示头像
网站标题的设置
1
title: "清羽飞扬" # 标题
需要修改为自己的网站提示关键词,毕竟和原作者不是一个称呼。
是否开启夜间模式
1
darkmode: false # 是否启用夜间模式
现在很多主流的Hexo博客主题都支持夜间模式,开启之后会更加方便,当然需要自己魔改的魔改一下。
进阶操作
如果你有前端基础,除了以上配置 ,你还可以自行定义相关页面,打开插件中的go.html
,这里我为了方便大家修改,没有进行代码压缩,其中CSS分为三部分:通用配置,夜间专用,白天专用:
通用配置:这里包含除了夜间和白天配色,其余所有css配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97body {
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
margin: 0;
font-family: Arial, sans-serif;
overflow: hidden;
flex-direction: column;
}
.avatar-placeholder, .avatar {
width: 100px;
height: 100px;
border-radius: 50%;
margin-bottom: 15px;
display: block;
}
.avatar {
display: none;
}
.description {
font-size: 18px;
}
.subtitle {
font-size: 12px;
margin-bottom: 20px;
color: #C4C4C4;
}
.loading {
text-align: center;
padding: 30px;
border-radius: 18px;
animation: fadein 2s;
width: 400px;
max-width: 90%;
}
@keyframes fadein {
from { opacity: 0; }
to { opacity: 1; }
}
.content {
margin-bottom: 20px;
}
.url-text {
margin-bottom: 10px;
font-size: 16px;
letter-spacing: 1px;
}
.jump-url {
font-size: 20px;
display: block;
margin-top: 5px;
margin-bottom: 25px;
padding: 15px;
border-radius: 8px;
height: 25px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.countdown-text {
margin-top: 12px;
font-size: 12px;
}
.button-container {
display: flex;
justify-content: center;
gap: 20%;
margin-top: 20px;
}
.button {
padding: 10px 20px;
border-radius: 16px;
border: none;
cursor: pointer;
font-size: 16px;
width: 120px;
height: 40px;
}
.cancel-button {
color: black;
}
.confirm-button {
color: white;
}
.progress-bar {
width: 100%;
border-radius: 5px;
overflow: hidden;
height: 10px;
margin-top: 20px;
}
.progress {
width: 100%;
height: 100%;
transition: width 1s;
}夜间配置:夜间配置主要配置夜间的一些配色:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35{% if darkmode %}
body {
background: linear-gradient(135deg, #364f6b, #222831);
}
.loading {
background: #393e46;
color: #EFEFEF;
box-shadow: 0 4px 8px rgba(100, 100, 100, 0.1);
}
.description {
color: #F3F3F3;
}
.url-text, .countdown-text {
color: #EFEFEF;
}
.jump-url {
border: 1px solid #777;
background-color: #333;
color: #EFEFEF;
}
.cancel-button {
background-color: #872C2C;
color: #FFF;
}
.confirm-button {
background-color: #28566F;
color: #FFF;
}
.progress-bar {
background-color: #444;
}
.progress {
background-color: #888;
}
{% endif %}白天配置:同上,包含白天配色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29{% if not darkmode %}
body {
background: linear-gradient(135deg, #fce38a, #eaffd0);
}
.loading {
background: rgba(255, 255, 255, 0.7);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.url-text {
color: #333;
}
.jump-url {
border: 1px solid #ccc;
background-color: #F7F9FE;
color: #333;
}
.countdown-text {
color: #515151;
}
.cancel-button {
background-color: #a6e3e9;
}
.confirm-button {
background-color: #3fc1c9;
}
.progress {
background-color: #abedd8;
}
{% endif %}注意代码之中的
{% if not darkmode %}
不能删除,这个是模板文件的配置,表示当在符合要求时将其包裹的内容放置到文件中,否则抛弃,我将夜间和白天的配色分开目的是尽量压缩生成的html页面代码量,加快加载速度。下面的JS选项,如果无必要,请不要删除。除此之外,你还可以更改其中的结构,但是请尽量不要修改类名,有些类名可能绑定有特定的跳转。
魔改杂记
在开发过程中,我曾使用时间来判断白天或者夜间,添加对应的类来调整暗色和亮色,但是我发现在加载后切换亮暗的一瞬间总会有一部分闪烁,很影响观感,于是我去掉了按照时间自动切换的功能,改为选择亮暗,尽可能给不想改源码的童鞋更多的,更个性化的选择。
在白名单链接方面,我使用字符串匹配,这样可能不如通配符的匹配性那么强,但是优点在于好理解。在原作者中还有一些配置项,比如额外参数:external
、 nofollow
、 noopener
、 noreferrer
,经过烤炉后,我选择直接将这个添加到网站中,因为这个选项非常常用,下面是解释:
- external:指示链接指向外部网站。这通常是为了便于样式和 JavaScript 控制,但对搜索引擎爬虫没有直接影响。
- nofollow:告诉搜索引擎不要跟踪这个链接,也就是说,不要将链接目标的权重传递给目标页面。因此,使用 nofollow 可以防止搜索引擎通过这个链接爬取目标页面并将其权重传递。
- noopener:用于防止新打开的页面能够通过 window.opener 属性获得对原页面的引用。这主要是为了防止某些安全风险,例如页面篡改和钓鱼攻击。
- noreferrer:告诉浏览器在导航到链接目标时不发送 HTTP Referer 头信息。这对于保护隐私和安全有一定帮助。
这些功能都是非常常用的,可以进一步保护我们的网站,并且也不会有什么副作用,并且经过go.html
包裹了的地址也显然没有了被爬取的必要,所以我将这个配置项直接添加到了代码中,减少参数量。
写在最后,分享一下作者的信息吧