base标签仅在HTML解析时对纯相对href做一次拼接,不影响JS运行时修改;href="#"等会被错误拼接导致404或页面重载;/开头或含协议的URL绕过base;base校验静默失败易致线上404。

base标签只在HTML解析时重写纯相对href
<base> 不是运行时代理,它只在浏览器解析 HTML 文档的那一刻,对后续出现的 a 标签中“纯相对路径”(即不以 /、http://、https://、// 开头的 href 值)做一次拼接。比如:<base href="https://cdn.example.com/v3/"> + <a href="about.html"></a> → 实际跳转地址为 https://cdn.example.com/v3/about.html。
这个过程发生在 DOM 构建初期,之后任何 JS 修改 a.href 或点击触发的行为,都不再受 <base> 影响——它只管“初始值”的解析。
href="#" 和 href="section2" 会被 base 拼错
这是最隐蔽也最常见的坑:href="#"、href="section2"、href="https://www.php.cn/link/93ac0c50dd620dc7b88e5fe05c70e15b" 这类值,只要不是以 / 或协议开头,浏览器就认定为纯相对路径,强制拼到 base href 后面。
-
<base href="/myapp/">+<a href="section2"></a>→ 解析成/myapp/section2(404,不是锚点) -
<base href="https://cdn.example.com/v3/">+<a href="#"></a>→ 解析成https://cdn.example.com/v3/#(页面重载,滚动回顶)
根本原因:浏览器把 # 当作一个文件名,而不是锚点标识符;它不会特殊识别 # 或 ID 名,只机械拼接字符串。
立即学习“前端免费学习笔记(深入)”;
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
根相对路径和绝对URL完全绕过base
以下写法不受 <base> 影响,可安全用于锚点或跨域跳转:
-
href="/#section2":以/开头,直接按当前域名根路径解析,base不介入 -
href="https://example.com/#section2":含协议,视为绝对 URL -
href="javascript:void(0)"或href="#" onclick="event.preventDefault(); scrollTo(...)":用 JS 显式接管,跳过默认解析逻辑
注意:href="/#section2" 在单页应用中要配合路由守卫,否则可能触发整页刷新;而 href="#section2" 在有 <base> 时一定失效。
为什么控制台不报错却满屏404?
因为浏览器对 <base href> 的校验是静默的:只要值不合法(如 href="assets/"、href="../static/"、href="/myapp" 缺结尾斜杠),整个标签就被丢弃,但你完全看不到提示。
结果就是所有本该被 base 修正的 href,全部退回到按当前页面 URL 解析——开发时可能刚好路径碰巧对,上线部署到子目录后批量 404。
真正容易被忽略的是:base 的作用范围极窄,只覆盖 HTML 解析阶段的几个属性,且对路径格式极其敏感;它既不统一 JS 中的 fetch,也不影响 CSS 的 @import,更不感知 SPA 路由。把它当成“全局路径开关”,基本等于埋雷。


















