//开头的base href会被浏览器自动补全为当前页面协议(http://或https://)后拼接路径,仅适用于合法域名且结尾带斜杠的场景,如//cdn.example.com/v3/;非法写法如//cdn、//example.com(缺斜杠)等会被静默忽略。

base href 用 // 开头时,浏览器怎么解析
协议相对路径(如 //cdn.example.com/v3/)会被浏览器自动补全为当前页面的协议(http:// 或 https://),再拼接后续路径。它不改变域名和路径,只补协议,适合混合 HTTP/HTTPS 环境或 CDN 场景。
但注意:这个行为仅在 href 值以 // 开头且后面紧跟合法域名时才生效;写成 //cdn、//./static 或 //localhost:3000(无域名)都会被静默忽略。
-
//cdn.example.com/v3/✅ 安全,自动继承协议,常见于 CDN 配置 -
//example.com❌ 结尾缺斜杠,Firefox 可能截断成//example.comcss/ -
//cdn❌ 域名不完整,浏览器直接丢弃整个<base>标签 -
//localhost:3000/⚠️ 部分浏览器(如 Safari)对本地开发协议相对路径支持不稳定,建议改用http://localhost:3000/
相对协议路径 + base 组合时,哪些属性会受影响
<base href="//cdn.example.com/v3/"> 只会影响 HTML 解析阶段的纯相对路径(即不以 /、: 或协议开头的路径),不会影响根相对路径或绝对 URL。
比如:<img src="logo.png"> 会变成 https://cdn.example.com/v3/logo.png(假设当前页是 HTTPS),但 <a href="/admin"></a> 仍解析为 https://current-domain.com/admin,完全绕过 <base>。
- ✅ 受影响:
<script src="app.js"></script>、<link href="style.css">、<img src="icon.svg">、CSS 中的background: url(avatar.jpg) - ❌ 不受影响:
fetch('./api')、import('./utils.js')、@import "reset.css"、<iframe src="/frame.html"></iframe>、<img srcset="logo-2x.png 2x"> - ⚠️ 特别注意:
<a href="#"></a>在协议相对<base>下会跳转到//cdn.example.com/v3/#section,触发页面重载——这不是 bug,是协议相对路径被严格拼接的结果
为什么 // 开头的 base href 在某些环境下会失效
失效不是因为协议相对本身有问题,而是它对上下文更敏感:一旦页面本身是 file:// 协议(如双击打开本地 HTML),//cdn.example.com 会被解析为 file://cdn.example.com,导致所有资源请求失败;同理,当页面通过代理或内网服务(如 http://192.168.1.100:8080)访问时,// 仍会补 http://,但若 CDN 域名不支持 HTTP,则请求直接被拒绝。
- 本地开发慎用
//:推荐显式写http://localhost:3000/或构建时注入环境变量 - 内网部署需确认 CDN 是否同时支持 HTTP/HTTPS;否则应改用带协议的绝对 URL
- Service Worker 缓存策略中若依赖
self.location.origin,它和//解析出的实际 origin 可能不一致,造成预缓存路径错位
SPA 子路径部署时,// 协议相对 base 和前端路由如何协同
协议相对 <base href="//cdn.example.com/app/"> 只解决静态资源加载路径,不影响前端路由跳转逻辑。Vue Router 的 base: '/app/' 或 React Router v6 的 <router basename="/app/"></router> 必须单独配置,二者互不读取对方值。
真正麻烦的是构建工具:Webpack 的 publicPath: '//cdn.example.com/app/' 若与 HTML 中手写的 <base href="//cdn.example.com/app/"> 同时存在,可能导致 chunk 路径被拼两次(如 //cdn.example.com/app//cdn.example.com/app/js/app.js)。
- Vite 用户:构建时已设
base: '//cdn.example.com/app/',HTML 中就不该再写<base>标签 - 微前端场景:子应用若也设了
<base>,父容器的<base>会被覆盖,必须由主应用统一控制或禁用子应用的 base - 最稳妥做法:生产环境用完整绝对 URL(
https://cdn.example.com/app/),避免协议推导带来的不确定性
<base> 在页面通过 iframe 嵌入时,其解析基准仍是顶层页面的协议,而不是 iframe 的 src 协议——这意味着嵌入页里所有纯相对路径都会按顶层协议拼,可能跨协议失败。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











