标签会劫持所有相对路径 AJAX 请求,将其基准 URL 改为 值,导致请求发往错误地址;应改用根相对路径(如 /api/users)或显式拼接 origin 避免干扰。

会,<base> 标签会静默劫持所有相对路径的 AJAX 请求目标地址,导致 404、跨域错误或请求发到完全意料之外的 URL。
为什么 <base> 会让 $.ajax() 或 fetch() 发错地址
浏览器在解析任何相对 URL(包括 fetch('api/user')、$.get('data.json')、XMLHttpRequest.open('GET', 'login'))时,都会先用当前页面的 <base href="...">> 做基准拼接,而不是按脚本所在位置或当前 URL 路径来算。
比如页面顶部写了:<base href="https://k686.com/">,而你的 JS 在 /admin/index.html 里执行 fetch('settings'),最终发出的请求是 https://k686.com/settings —— 不是你期望的 /admin/settings,甚至可能跨域失败。
常见错误现象:
- 本地开发正常,上线后 AJAX 全部 404(
<base>指向了生产域名,但接口路径没配对) - 控制台报
No 'Access-Control-Allow-Origin' header(明明是同站请求,却因<base>变成跨域) - 接口返回 HTML 页面内容(比如返回了首页 HTML),因为请求被重定向到了
<base>指定根路径下的默认页
如何安全地绕过 <base> 对 AJAX 的干扰
不要删 <base>(尤其在 JSP/模板系统中它常被框架自动注入),而是让请求路径“脱钩”于页面基准:
- 所有 AJAX 地址写成以
/开头的**绝对路径**(从根目录起算):用fetch('/api/v1/users'),而不是fetch('api/v1/users') - 动态构造 URL 时,显式用
window.location.origin或后端注入的上下文路径变量(如 JSP 中的${pageContext.request.contextPath})拼接:fetch('${pageContext.request.contextPath}/ajax/data.txt') - 如果必须用相对路径(比如微前端子应用隔离场景),可在发起请求前临时移除
<base>,发完再恢复(不推荐,易出竞态)
<base> 和表单 action、图片 src 的行为一致吗
一致。所有 HTML 中的相对 URL 属性(<a href></a>、<img src alt="base标签影响AJAX吗_相对路径基准注意事项【说明】" >、<form action></form>、<link href>、<script src></script>)都会受 <base> 影响 —— 但注意:<script></script> 内部的 JS 字符串(如 'api/login')不会被自动解析,只有浏览器主动解析的属性才受影响。
也就是说:<script>fetch('api/login')</script> 会被影响;但 <script src="js/main.js"></script> 里的 fetch('api/login') 同样会被影响 —— 因为 fetch 的参数仍是相对 URL,浏览器照规则处理。
容易被忽略的一点:某些构建工具(如 Webpack 的 public 目录资源引用)或 SSR 框架(如 Next.js 的 basePath)也会模拟 <base> 行为,原理不同但效果类似,排查时需一并检查。


















