<base>标签重置HTML解析器对相对URL的基准起点,非“加前缀”;href必须为绝对URL或根相对路径(结尾带/),且须置于<head>最前、唯一存在,否则静默失效导致404。

<base> 标签不是“简化路径”的快捷键,而是重置 HTML 解析器对相对 URL 的基准起点。配错一个字符,<img src="logo.png"> 就 404,且浏览器不报错——你得靠排查资源请求地址才能发现它根本没生效。
base href 必须是绝对 URL 或根相对路径(结尾带斜杠)
浏览器只识别 href 值以 https://、http://、// 或 / 开头的写法。其他一律静默忽略。
-
href="assets/"→ 缺协议和域名,被丢弃 -
href="../static/"→ 含..,被丢弃 -
href="/myapp"→ 结尾没斜杠,Firefox 可能截断成/myappcss/,导致style.css请求错位 -
href="https://cdn.example.com/v3"→ 同样缺尾斜杠,风险同上 - ✅ 推荐:
href="https://cdn.example.com/v3/"(CDN 场景最稳) - ✅ 合法:
href="/myapp/"(子路径部署必须,斜杠不能少) - ✅ 可用:
href="//cdn.example.com/v3/"(自动继承当前协议)
base 标签必须放在 <head> 最顶部且只能有一个
它影响的是 HTML 解析顺序:只对它之后出现的相对 URL 生效。放错位置 = 白写。
- 错误顺序:
<head><title>App</title><link href="main.css"><base href="/myapp/"></head>→main.css已按原页面 URL 解析完毕,不受控 - 错误位置:
<body><base href="/myapp/"></body>→ 浏览器直接忽略,无提示 - 重复声明:
<base href="/a/"><base href="/b/">→ 只有第一个生效,Chrome 控制台提示Multiple base elements detected. Only the first one is used. - 禁止 JS 动态插入:
document.head.appendChild(baseEl)→ 解析阶段早已结束,已加载的资源不会重算
哪些属性真受影响,哪些完全不管
<base> 不是全局代理,只作用于 HTML 解析阶段的纯相对路径(即不以 /、: 或协议开头的字符串)。
立即学习“前端免费学习笔记(深入)”;
- ✅ 真受影响:
<img src="icon.svg">、<script src="bundle.js">、<link href="theme.css">、<form action="submit.php">、CSS 中的background: url(avatar.jpg) - ❌ 完全不受影响:
fetch('./api/data.json')、import('./utils.js')、@import "reset.css"、<iframe src="page.html"> - ⚠️ 半受影响:
document.baseURI会返回<base href>的值,可用于构造 URL(如new URL('data.json', document.baseURI)),但window.location和document.URL完全不变
SPA 部署在子路径时,base 和前端路由别混为一谈
<base href="/myapp/"> 和 Vue Router 的 base: '/myapp/' 是两套独立机制,不自动同步。只设一个,另一个大概率出问题。
- HTML
<base>是为了让<script src="js/app.js">正确加载,否则 chunk 404 - Vue Router / React Router v6+ 必须显式配置
base: '/myapp/',否则router.push('/home')会跳到根路径 - Service Worker 若缓存策略依赖
self.location.origin + '/myapp/',而 HTML 没配<base>,预缓存路径就错位 - 微前端下,子应用若同时设了 Webpack
publicPath和<base>,资源路径可能被拼两次,变成/myapp/myapp/js/app.js
最容易被忽略的点是:CSS 里的 url() 确实受 <base> 影响,但很多人写了 background: url(images/bg.png) 却忘了检查它是否被重写成了错误路径;更隐蔽的是,fetch("api/users") 这种相对路径也会被改写,导致 API 请求发到子路径下而非服务端预期位置——它不报错,只是后端收不到请求。



















