由于中文URL在各种情况下的兼容性都不太好:例如我使用的sitemap插件永远会将其编码为URL格式,导致URL看起来非常杂乱且冗长;或者将URL从浏览器中复制出来时,一般会被自动编码成URL格式,不便于查看。
因此我想迁移到一种更加简短的URL表示方式上,同时还要保持已经写出来的博客的URL不发生变化,避免原有的搜索引擎收录失效。
采用更加简短的URL表示
经过搜索,我发现了两种方式,一种是基于abbrlink
的插件,另一种是Hexo官方提供的:hash
变量。
本着尽量降低第三方依赖的想法,我最终选择了:hash
方式。我们可以通过在_config.yml
中设置
1 |
|
来使用此变量。
:hash
变量的变化规则
此变量的实现应该在这里,可以看到生成此hash的来源是文件名及其front-matter
中的date
变量。只要不修改这两个属性,原则上应该不会导致hash发生变化。
hash碰撞可能性
在原本的构思中,我想将permalink直接设置为/:hash/
,这样比较简短。但是随后考虑到hash存在碰撞的可能,同时url能展示的信息太少,因此最终采用了:year/:month/:day/:hash/
。这样只需要保证每天写的文章的hash不会碰撞即可,而我基本几天才能写完一篇文章,所以碰撞基本是遇不到了。
保持兼容性
虽然本博客已经被收录的文章数量少的可怜,甚至在Google上只被收录了主页。但是为了保证兼容性我还是要保证已经写完了的文章的URL不发生变化。由于本博客为静态博客,通过webserver进行重定向需要写非常非常长的配置,而且是和本博客的仓库分开托管,因此需要另寻Hexo提供的解决方案。
1 |
|
在访问时,此文章的链接就会被设置为https://example.com/1970/1/1/hello_world/
。所以接下来我们只需要给已经写出来的文章的每个front-matter
中添加这个设置项了。
使用脚本自动添加permalink配置项
显而易见,这项工作不应该手动完成。因此我用python实现了一个脚本,它会列出并读取./source/_posts
下所有文件,拼接成我原本使用的默认的全局permalink格式::year/:month/:day/:title/
,并将此permalink添加到每篇文章的front-matter
的开头处。
1 |
|
最终,如果不出意外的话,本文章之前的所有文章的URL都会保持不变,而从本文章开始,所有文章的URL都会变成类似于https://blog.gugugu.cloud/2025/06/16/f67a5a346810/
的格式。