惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
博客园 - 叶小钗
The Cloudflare Blog
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
小众软件
小众软件
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
宝玉的分享
宝玉的分享

姓王者的博客

Linux用户Secure Boot自主维护指南 | 姓王者的博客 MAD Bugs 已经开始——关于信息安全的军备竞赛 | 姓王者的博客 解决钉钉Dingtalk无法在Linux新版内核上启动问题-修复可执行栈错误 | 姓王者的博客 突发:GitHub 正遭受大规模 Issue 赌博广告轰炸 | 姓王者的博客 Ubuntu26.04-beta体验:坚毅浣熊! | 姓王者的博客 fakeclaw装作龙虾发贴吧 | 姓王者的博客 找回12年前的QQ记忆 | 姓王者的博客 在Linux上玩Flash网页游戏-洛克王国 | 姓王者的博客 Copilot将使用交互数据来训练 | 姓王者的博客 重要通知-请更新我的GPG公钥 | 姓王者的博客 为了自由Android | 姓王者的博客 GPL"2,3"事 | 姓王者的博客 短文-对VitePlus的一点🤏小贡献 | 姓王者的博客 Bing收录没了?亲测有效的快速恢复指南 | 姓王者的博客 解决桌面设备二维码快速识别的工具-ClipQR | 姓王者的博客 解决 Nautilus 自定义终端插件安装依赖问题 | 姓王者的博客 OpenClaw 该熄火了 | 姓王者的博客 Vite8 - 统一的基建开始 | 姓王者的博客 Astro 6 推出啦 | 姓王者的博客 ubuntu的openvpn异常暂停推送更新 | 姓王者的博客 Ubuntu 24.04 安装 Win10 虚拟机 | 姓王者的博客 ESA-后记:热爱阿里云 | 姓王者的博客 Moonbit 0.8.0 重大发布,我也要改一下我的包 | 姓王者的博客 ESA Pages 边缘开发大赛获奖 | 姓王者的博客 Astro: 优化katex,mermaid和灯箱使用 | 姓王者的博客 从edgeone迁移到esa | 姓王者的博客 出租人类:AI时代的荒诞与真实 | 姓王者的博客 Astro 5.17构建性能优化实践:从18s到13s | 姓王者的博客 Moonbit License Checker 开发使用 | 姓王者的博客 Stalux Astro博客主题自荐 | 姓王者的博客
把Hexo永久链接迁移到Astro | 姓王者的博客
作者:xingwangzhe · 2026-01-28 · via 姓王者的博客

🕒 阅读时间:2 分钟 📝 字数:541 👀 阅读量: Loading...

Hexo 生态过来的朋友们,可能会遇到一个问题,就是 Hexo 的 permalink(或 abbrlink)和 Astro 的路由规则不太一样,导致之前的文章链接可能需要大批量更改而无法访问。今天我们就来讲讲如何把 Hexo 的永久链接迁移到 Astro。

Hexo 可能的永久链接规则

permalink 或者 abbrlink 的目的是通过一个短链接来访问文章,通常由字母或数字混合组成,例如 eef6378a1b2c3d4。Hexo 的 permalink / abbrlink 通常由插件生成,目的是避免路由使用文件名,从而在解析中文时产生 %URL 编码(导致乱码),这会影响 SEO,因此很多人采用这种方式。

迁移到 Astro 的考虑

如果你打算迁移到某些 Astro 博客主题,你会发现这些主题通常也通过文件名来生成路由,例如:/posts/把hexo永久链接迁移到Astro。这会导致之前的 permalinkabbrlink 无法访问,因为路由规则不匹配。

如果想 尽可能保持小的改动,可以让路由由 frontmatter 中的 permalinkabbrlink 字段来控制,这样就能 避免大批量修改文章链接

更改 Astro 的内容集合配置

直接更改

对于博客类型的内容,大多数 Astro 主题会在 src/content.config.tssrc/content/config.ts 中定义集合。需要找到该文件并修改对应集合的定义,以我这个 博客主题 为例:

const posts = defineCollection({

loader: glob({

pattern: ["*.{md,mdx}"],

base: "stalux/posts/",

generateId: ({ data }) => String(data["abbrlink"]), // 通过 `abbrlink` 字段来生成路由 ID

}),

schema: z.object({

title: z.string(),

abbrlink: z.string().or(z.number().transform((num) => num.toString())), // 支持字符串或数字

date: z.preprocess((v) => (typeof v === "string" ? new Date(v) : v), z.date()),

updated: z.preprocess(

(v) => (v == null ? undefined : typeof v === "string" ? new Date(v) : v),

z.date().optional(),

),

draft: z.boolean().optional().default(false),

tags: z.preprocess(

(val) => (typeof val === "string" ? [val] : val),

z.array(z.string()).optional(),

),

categories: z.preprocess(

(val) => (typeof val === "string" ? [val] : val),

z.array(z.string()).optional(),

),

cc: z.string().optional().default("CC-BY-NC-SA-4.0"),

}),

});

解释

对于 abbrlink 字段,可能是纯数字也可能是字符串,因此在 schema 中要同时支持字符串或数字,并在需要时把数字转换为字符串:

abbrlink: z.string().or(z.number().transform((num) => num.toString())), // 支持字符串或数字

然后在 generateId 函数中,通过 frontmatterabbrlink 字段生成路由 ID,确保路由与之前的 Hexo 永久链接保持一致:

generateId: ({ data }) => String(data["abbrlink"]), // 通过 `abbrlink` 字段来生成路由 ID

一举多得的好处

  • 避免大量修改:不需要手动改动每一篇文章的链接。
  • 保持链接可用:迁移后原有的短链接依然能访问。
  • 需注意唯一性:以前依赖文件系统生成的路由 ID 通常会避免重名;改为使用 abbrlink 时,请确保 abbrlink 在集合中唯一,否则 generateId 会抛出错误。

总之,通过这种方式,可以轻松地把 Hexo 的永久链接迁移到 Astro,并且无需大批量修改文章链接,非常方便