L
O
A
D
I
N
G

外部链接错误跳转的原因和解决


外部链接错误跳转的原因与解决

一、问题现象

最近遇到一个非常奇怪的现象:我在点击一篇文章中写的外部链接时,本该正常跳转到外部网站,但点击跳转后,出现的跳转链接经过几秒钟的加载后,最终跳转链接的后缀消失,直接跳回到了我的博客首页

例如,文章的一个链接:

[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/

我又赶紧查看了其他文章的外部链接,发现都不能成功跳转😰


二、初步排查

我怀疑是以下几个问题之一:

  1. Hexo插件问题
  2. Hexo 的路径配置错误
  3. 主题脚本(matery.js) 拦截了外链;
  4. 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),其工作流程是:

  1. Hexo 生成外链时,自动转为/go.html?u=base64(目标地址)
  2. Matery 的 matery.js 在页面加载时解析参数 u,并通过window.location.href = decodeURIComponent(atob(u))实现跳转。
  3. 若路径或 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 在生成静态文件时,会根据 urlroot 自动注入 <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 的路径生成机制,也提醒自己每次改动配置都要仔细核对 urlroot。希望这篇文章能帮到遇到同样问题的朋友。


文章作者: loyeh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 loyeh !
评论
  目录