base href在二级域名下必须用绝对URL(如https://cdn.example.com/v2/)或协议相对URL(//cdn.example.com/v2/),不能仅用根相对路径(如/myapp/),否则无法跨域加载CDN资源,且非法值会被浏览器静默忽略导致404。

base href 在二级域名下必须写成绝对 URL
二级域名(如 admin.example.com)不是根路径,/ 开头的 href 值仍会指向该二级域的根,但若你实际资源托管在 CDN 或另一域名(如 cdn.example.com),仅靠 / 无法跨域。浏览器对 <base href> 的校验不关心「是不是二级域名」,只认开头字符:必须以 https://、http://、// 或 / 开头,否则整条标签静默丢弃。
常见错误是误以为 <base href="/assets/"> 能适配 admin.example.com 和 shop.example.com 两个二级域——它确实能加载各自域下的 /assets/logo.png,但一旦资源实际放在 https://cdn.example.com/v2/,这个写法就完全失效,所有 <img src="logo.png"> 都 404。
-
<base href="https://cdn.example.com/v2/">✅ 推荐:明确协议、域名、版本,部署到任意二级域都无需改 -
<base href="//cdn.example.com/v2/">✅ 协议相对:自动继承当前页是http还是https,适合混合环境 -
<base href="/assets/">⚠️ 仅当资源真在当前二级域根路径下才可用,且结尾斜杠不能少(/assets在 Firefox 中可能拼成/assetscss/) -
<base href="assets/">❌ 无效:缺协议和根斜杠,浏览器直接忽略
二级域名 + 子路径部署时 base href 必须带完整路径
比如应用部署在 https://admin.example.com/myapp/,资源却托管在 https://cdn.example.com/myapp/v3/。这时 <base href="/myapp/"> 是错的——它会让 <script src="app.js"> 请求 https://admin.example.com/myapp/app.js,而非 CDN 地址。
正确做法是直接用完整绝对 URL,并把子路径纳入其中:
立即学习“前端免费学习笔记(深入)”;
-
<base href="https://cdn.example.com/myapp/v3/">✅ 所有相对路径(app.js、style.css)都会拼到这里 -
<base href="/myapp/v3/">❌ 仍走二级域本身,没解决跨源问题 - 若用 Webpack/Vite 构建,
publicPath或base配置值必须与 HTML 中的<base href>一致,否则资源路径被拼两次(如/myapp/v3//myapp/v3/app.js)
二级域名下 target="_blank" 的副作用更隐蔽
<base target="_blank"> 在二级域名页面里同样生效,但它影响的是所有未显式声明 target 的 <a> 标签,包括第三方 SDK 插入的链接、分析埋点跳转、甚至富文本里的 <a href="..."/>。更关键的是,现代浏览器对 target="_blank" 会强制补上 rel="noopener",但旧版 Safari 或部分 WebView 不会,导致 window.opener 泄露风险。
- 避免全局设
target,改用显式声明:<a href="..." target="_blank" rel="noopener"> - 如果必须用
<base target>,确保所有内部链接已通过rel="noopener"或rel="noreferrer"显式加固 - 二级域名常用于管理后台,用户权限敏感,这类安全细节比主站更需关注
CDN 回源或灰度发布时 base href 容易被覆盖
很多团队用 Nginx 或 CDN 规则在响应头或 HTML body 中注入 <base>,比如根据请求 Host 自动写 <base href="https://cdn-{{env}}.example.com/">。这种动态注入极易出错:
- 服务端模板未渲染完成就返回 HTML,
<base href="%CDN_URL%">字面量发到浏览器 → 无效 - CDN 边缘节点缓存了未替换的 HTML 版本,不同环境混用 → 某些二级域加载的是测试 CDN 地址
- 灰度流量切到新 CDN 域名,但旧版 HTML 里还是老
<base href>→ 资源批量 404
真正可控的做法是构建时硬编码,或由统一网关在响应前做一次精准替换——别依赖客户端解析时的“猜测”。<base> 的作用点太早、太底层,容错空间几乎为零。



















