外部链接错误跳转的原因与解决
一、问题现象
最近遇到一个非常奇怪的现象:我在点击一篇文章中写的外部链接时,本该正常跳转到外部网站,但点击跳转后,出现的跳转链接经过几秒钟的加载后,最终跳转链接的后缀消失,直接跳回到了我的博客首页。
例如,文章的一个链接:
[xshell连接centos7-CSDN博客](https://blog.csdn.net/Wei_Naijia/article/details/124300814)
点击跳转后,浏览器的地址栏变成:
https://lo-y-eh.github.io/go.html?u=aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dlaV9OYWlqaWEvYXJ0aWNsZS9kZXRhaWxzLzEyNDMwMDgxNA==
几秒后跳转的链接部分消失,变成了:
https://lo-y-eh.github.io/
我又赶紧查看了其他文章的外部链接,发现都不能成功跳转😰
二、初步排查
我怀疑是以下几个问题之一:
- Hexo插件问题
- Hexo 的路径配置错误。
- 主题脚本(matery.js) 拦截了外链;
- Markdown 渲染器 截断了长链接;
由于跳转链接部分内容在加载时“消失”,所以我首先怀疑是不是外部链接相关插件出了问题。通常配合 hexo-external-link 插件来实现外链安全跳转功能,即:
点击外链 → 跳转至中转页
/go.html?u=xxxx→ 再由 JS 重定向到目标地址。
但在网上搜寻一番后,并没有发现相关问题。
于是我开始排查是否是路径配置问题:打开浏览器开发者工具 → 元素栏,发现外链被渲染成:
https://lo-y-eh.github.io/go.html?u=aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dlaV9OYWlqaWEvYXJ0aWNsZS9kZXRhaWxzLzEyNDMwMDgxNA==
这表明 Hexo 在生成页面时,把外部链接拼接到了站点路径之后。
到这里可以初步判断,问题很可能出在 Hexo 的 _config.yml 配置路径有误。
三、问题根源
打开站点配置文件 _config.yml,我发现原来写的是:
url: http://Lo-Y-eH.github.io
permalink: posts/:abbrlink/
没有 root 项。
而正确的配置应该包含:
root: /
Hexo 在生成静态页面时,会以 url + root 作为全局链接的基准路径。
如果没有 root,浏览器会将外链当作相对路径进行解析,拼接成:
http://Lo-Y-eH.github.io/https://github.com/...
GitHub Pages 找不到这样的路径,于是就跳回首页。
这解释了“表象问题”——外链变成站内路径。
Matery 主题的外链安全跳转机制
Matery 主题启用了外链安全跳转功能(对应 /go.html),其工作流程是:
- Hexo 生成外链时,自动转为
/go.html?u=base64(目标地址) - Matery 的
matery.js在页面加载时解析参数u,并通过window.location.href = decodeURIComponent(atob(u))实现跳转。 - 若路径或 base64 参数解析失败(例如 root 拼接错误),脚本无法识别正确外链,于是回退到默认行为——跳转首页。
因此,根本原因是:
root 配置错误使得 go.html 的参数路径失效,Matery 外链脚本在解析失败后默认跳转到首页。
换句话说,root 配置错误是“导火索”, 而 Matery 的外链重定向逻辑才是“最后执行错误跳转”的那一步。
四、解决方案 ✅
只需在 _config.yml 中补上正确的 root 即可:
url: https://loyeh.top
root: /
permalink: posts/:abbrlink/
pretty_urls:
trailing_index: true
trailing_html: true
⚠️ 注意:
如果你的博客使用自定义域名(例如 example.com),
url应该是你的域名;如果你的博客部署在 GitHub Pages 子目录(例如
https://lo-yeh.github.io/myblog/),则应设置:url: https://lo-yeh.github.io root: /myblog/
总结
| 场景 | 正确配置 |
|---|---|
| GitHub Pages 根目录,如 https://username.github.io) | url: https://username.github.io root: / |
| GitHub Pages 子路径,如 https://username.github.io/blog/) | url: https://username.github.io root: /blog/ |
| 自定义域名,如 https://loyeh.top | url: https://loyeh.top root: / |
修改后,执行:
hexo clean & hexo g & hexo d
然后重新打开博客,外部链接就能正常跳转啦 🎉
五、原理解释
Hexo 在生成静态文件时,会根据 url 和 root 自动注入 <base> 标签:
<base href="https://loyeh.top/">
浏览器解析所有相对路径(包括 /go.html?u=...)时,都会以 <base> 为基准。
若 root 配置错误或缺失,/go.html 的解析路径就会出错,matery.js 解析不到正确参数,浏览器就会误认为你的外部链接是相对路径,从而导致跳转错误。
最终触发“安全回退”逻辑 —— 重定向至首页。
六、总结
✅ 直接原因:
root配置缺失,导致外链路径被错误解析为相对路径;🔍 根本原因:Matery 的外链安全跳转机制在解析失败时默认跳转首页;
💡 解决方式:补全
_config.yml中的root项并确保url正确;🔒 建议:若你不需要外链中转功能,可在主题配置中关闭它:
external_link: enable: false
修复后,所有外部链接即可恢复正常跳转。
这个问题看似小,却很容易踩坑。
没有配置 root:,Hexo 会导致所有外部链接被错误地拼接在站点 URL 后面,从而跳回首页。
只要补上这一行:
root: /
世界就清净了😄。
✍️ 后记:
这次小插曲让我更深入理解了 Hexo 的路径生成机制,也提醒自己每次改动配置都要仔细核对url与root。希望这篇文章能帮到遇到同样问题的朋友。