base href值必须以/、https://、http://或//开头,否则整条标签被浏览器静默丢弃,导致所有纯相对路径(如img src、script src)按当前页url解析而批量404;合法写法仅限根相对路径(如/myapp/)或绝对/协议相对url(如https://cdn.example.com/v3/)。

base href 值必须以 /、https://、http:// 或 // 开头,否则整条标签静默失效
浏览器对 <base href> 的合法性校验非常严格:只要 href 值不匹配这四类前缀,就直接丢弃该标签,不报错、不警告,后续所有相对路径(如 js/app.js)仍按当前页面 URL 解析——上线后批量 404 却查不出原因。
常见非法写法包括:assets/、../static/、dist/、%PUBLIC_URL%/、/admin(缺尾斜杠)。Firefox 和 Opera 对缺斜杠的根路径(如 /myapp)会截断拼接,导致 style.css 变成 /myappcss/。
合法且推荐的写法:
-
/myapp/—— 根相对路径,结尾必须带斜杠 -
https://cdn.example.com/v3/—— 绝对 URL,协议+域名+路径全明确 -
//cdn.example.com/v3/—— 协议相对,自动继承当前页协议
base 只在 HTML 解析阶段重置纯相对路径的基准,顺序和位置决定是否生效
<base> 不是全局重写器,它只影响 HTML 解析器“从上往下”遇到的、尚未解析的纯相对路径。它的作用时机极早,且不可逆。
这意味着:
- 必须放在
最顶部,且只能有一个;放错位置(比如在<title></title>后)会导致前面的<link href="main.css">已按原始 URL 解析完毕,不受控 - 放在
里 → 浏览器完全忽略 - 服务端模板或组件多次注入(如 Vue 的
v-html中拼了两个<base>)→ 只有第一个生效,Chrome 控制台提示Multiple base elements detected. Only the first one is used. - 用 JS 动态插入(
document.head.appendChild(baseEl))→ 解析早已完成,新元素才受影响,已存在的<img src>不会重算
哪些路径真被 base 改写?哪些完全不受影响?
受控(HTML 解析阶段硬编码的纯相对路径):
-
<img src="logo.png">→ 拼为base.href + "logo.png" -
<script src="app.js"></script>、<link href="style.css"> - CSS 文件内
background: url(avatar.jpg)(注意:这是 HTML 解析时计算的,不是 CSS 引擎运行时 resolve) -
<form action="submit.php"></form>、<meta http-equiv="refresh" content="0;url=success.html">
完全不受控(JS/CSS 运行时行为,<base> 对其无感知):
-
fetch('./api/data.json')、new Worker('./worker.js') -
import('./utils.js')、import.meta.url - CSS 中的
@import "reset.css" -
<iframe src="/admin/frame.html"></iframe>(根相对路径,直接拼域名) <img srcset="logo-2x.png 2x">
多级路由和前端框架下,base 必须与路由配置显式对齐
<base href="/subapp/"> 不会让 Vue Router 或 React Router v6+ 自动识别子路径——它们根本不读 document.baseURI,必须手动配 base 参数。
典型错误场景:
- HTML 写了
<base href="/subapp/">,但 Vue Router 未设createRouter({ base: '/subapp/' })→router.push('/home')跳到根路径,资源加载却走/subapp/,行为割裂 - Webpack/Vite 的
publicPath或base配置与 HTML 中的<base>值重复 → 资源路径被拼两次,如/subapp//subapp/js/app.js - 静态部署在 GitHub Pages 子目录(如
https://user.github.io/my-project/),却用了<base href="/">→ 所有相对路径指向根域,全部 404
真正需要动态切换基准的预览环境(如 CI 构建的 /preview/v2/),必须在 HTML 输出前由服务端或构建工具注入正确值,而非靠 JS 运行时修改 —— 后者完全无效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











