杜和的官方网站

区块链|加密货币|比特币|以太坊|DeFi|Layer2|稳定币

0%

Hexo永久链接(Permalinks)生成方式比较

先说结论,Hexo生成永久链接(Permalinks)的最佳方式是在站点配置文件_config.yml中进行如下设置:

1
2
3
4
5
permalink: :layout/:year:month:day:hour:minute:second.html
permalink_defaults:
pretty_urls:
trailing_index: true # Set to false to remove trailing 'index.html' from permalinks
trailing_html: true # Set to false to remove trailing '.html' from permalinks

Hexo生成博客文章URL链接时,默认是:year/:month/:day/:title/这样的格式。如果博客文件名有中文的话,URL链接就会包含中文,复制URL路径把它粘贴到其他地方就会把中文变成一大堆乱码,使用不便而且会影响网站的SEO,同时链接层级太多也将影响SEO。

URL构成越简单越好,百度建议URL不要超过255字节。一个英文字符1字节,一个中文字符2字节。

方法一:设为title

最容易想到的方法,把URL设置成如下格式

1
permalink: :layout/:title.html

:layout为布局,:title为文件名,如果有篇名为《test-post》的文章其链接将会是这样

1
https://www.duheweb.com/post/test-post.html

这种方法有3个缺陷:

  1. 文章名必须为中文,这对中文博主来说很不友好,后期面对一堆全是英文名的md文件特别令人头疼。

  2. 不能改文件名,文件名一变,URL也会变化。

  3. 文件名不能起太长,否则会影响SEO,同时太长的文件名使得URL也不美观。文件名短的话其含义就会与文章标题有较大偏差,给后期维护造成混乱。

方法二:hexo-abbrlink插件

如果你之前有搜索过的话,可以发现这种方法有很多人推荐

安装hexo-abbrlink插件

1
npm install hexo-abbrlink --save

站点配置文件_config.yml设置成这样

1
2
3
4
permalink: posts/:abbrlink.html  # 此处可以自己设置,也可以直接使用 :/abbrlink
abbrlink:
alg: crc32 #算法: crc16(default) and crc32
rep: dex #进制: dec(default) and hex

生成的链接像这样

1
https://www.duheweb.com/posts/1690090958.html

这种方法也有缺陷:

重新生成的URL可能与之前不一样,喜欢双备份的人用此插件容易混淆URL。因为这种方法执行hexo generate才会在博客md文件的Front-matter 内增加abbrlink字段,这个字段就是URL的末尾。如果一篇博客耗时几天写了多个版本(V1和V2)才写完,在此期间没有执行过hexo generate,部署V2版本一段时间后才觉得V1版本更好,但此时V1是没有abbrlink字段,还得把V2的abbrlink复制到V2中。如果不复制,让插件再自动生成URL的话,新生成的URL可能会与以前不一样。因为即使abbrlink插件使用crc32算法生成abbrlink,也有重复的可能,遇到重复的情况插件会把abbrlink加1。那么问题来了,也许生成V2的abbrlink时没有加1,生成V1时却加1了,前后两个版本的URL就会不一样。

解释的可能有点绕,总之记住,用该插件重新生成一篇文章的URL可能与之前不一样,而实际使用中我们难免会有重新生成URL的需求。

方法三:hexo-abbrlink2插件

hexo-abbrlink的作者开发出了hexo-abbrlink2插件,这个插件可以使URL从指定数字开始递增,像这样:

1
2
3
https://www.duheweb.com/posts/1.html
https://www.duheweb.com/posts/2.html
https://www.duheweb.com/posts/3.html

这个方法同样也有缺陷:

  1. 同时生成多篇文章的URL时会重复,这是插件自身的bug。

  2. 与hexo-abbrlink存在同样的问题,重新生成的URL可能与之前不一样。

方法四:设为hash

hexo-abbrlink和hexo-abbrlink2插件出现此缺陷的原因是,他们不是在创建md文件时就生成URL(即生成abbrlink字段),如果我们能在执行hexo new就生成URL,这个问题企不是就解决了。

查阅Hexo的官方文档,发现还真可以,方法如下:

站点配置文件_config.yml设置成

1
permalink: :layout/:hash.html

:hash会根据文件名及date生成的URL,date就是文章md文件Front-matter 内的字段。生成的URL像这样

1
https://www.duheweb.com/post/3b48da9a3b8b.html

似乎很完美的解决了方法二、三的缺陷,因为date是创建md文件时就生成的,URL也很简短。

但它同样有问题,部署后不能再更改文件名。这对博主也是个较大的限制,谁也不能保证发表前取的文件名能一直符合心意,后期稍不留神就把文件名改了,然后URL也随之变化。

方法五:设为日期

:hash方法提醒了我们,date字段是生成URL的优良种子,我们何不用date直接生成URL呢。想到就做,把站点配置文件_config.yml设置成

1
permalink: :layout/:date.html

然后执行hexo generate,发现会报错,因为date形如“2021-04-12 13:15:54”,中间有空格。不过这很好解决,参考Hexo的官方文档,设置成这样就可以了

1
permalink: :layout/:year:month:day:hour:minute:second.html

生成的URL如

1
https://www.duheweb.com/post/20210412131554.html

还要注意站点配置文件中的pretty_urls设置是否是这样的

1
2
3
pretty_urls:
trailing_index: true # Set to false to remove trailing 'index.html' from permalinks
trailing_html: true # Set to false to remove trailing '.html' from permalinks

设为false的话,链接就变成了

1
https://www.duheweb.com/post/20210412131554

去掉URL末尾的.html,更简洁了。带不带html对SEO收录来说,影响不大,但不带html发外链的时候,有些平台编辑器会自动在URL后面加一个“/ ”造成404页面。所以,最好还是带上html,同时也能给人一种静态页面的安全感。