先说结论,Hexo生成永久链接(Permalinks)的最佳方式是在站点配置文件_config.yml中进行如下设置:
1 | permalink: :layout/:year:month:day:hour:minute:second.html |
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个缺陷:
文章名必须为中文,这对中文博主来说很不友好,后期面对一堆全是英文名的md文件特别令人头疼。
不能改文件名,文件名一变,URL也会变化。
文件名不能起太长,否则会影响SEO,同时太长的文件名使得URL也不美观。文件名短的话其含义就会与文章标题有较大偏差,给后期维护造成混乱。
方法二:hexo-abbrlink插件
如果你之前有搜索过的话,可以发现这种方法有很多人推荐
安装hexo-abbrlink插件
1 | npm install hexo-abbrlink --save |
站点配置文件_config.yml设置成这样
1 | permalink: posts/:abbrlink.html # 此处可以自己设置,也可以直接使用 :/abbrlink |
生成的链接像这样
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 | https://www.duheweb.com/posts/1.html |
这个方法同样也有缺陷:
同时生成多篇文章的URL时会重复,这是插件自身的bug。
与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 | pretty_urls: |
设为false的话,链接就变成了
1 | https://www.duheweb.com/post/20210412131554 |
去掉URL末尾的.html,更简洁了。带不带html对SEO收录来说,影响不大,但不带html发外链的时候,有些平台编辑器会自动在URL后面加一个“/ ”造成404页面。所以,最好还是带上html,同时也能给人一种静态页面的安全感。