No 'Access-Control-Allow-Origin' 错误源于服务端未返回该响应头,浏览器直接拦截请求;需确保前端 fetch 显式设置 mode: 'cors' 与 credentials: 'include' 成对使用,后端 Access-Control-Allow-Origin 不为 *,且预检 OPTIONS 请求被正确处理。

浏览器报 No 'Access-Control-Allow-Origin' header 错误,不是你代码写错了,也不是后端挂了——是服务端响应里根本没返回这个头,浏览器直接拦掉请求,JS 连响应体都拿不到。
fetch 发起跨域请求时 mode: 'cors' 必须显式声明
很多人以为 fetch('https://api.example.com/data') 就能自动跨域,其实默认 mode 确实是 'cors',但一旦你加了 credentials: 'include' 却没配 mode,或者误设成 mode: 'no-cors',就会出问题:
-
mode: 'no-cors'会让请求“发出但不可读”:浏览器允许发出去,但响应是opaque类型,response.json()或response.text()全部报错 - 带
credentials: 'include'却没写mode: 'cors',部分浏览器会静默降级,导致后端收不到 cookie - 正确写法必须明确写出:
mode: 'cors'和credentials: 'include'成对出现
后端 Access-Control-Allow-Origin 不能为 * 时用了 credentials: 'include'
这是最常踩的坑:前端写了 credentials: 'include'(比如要传 cookie 或 Authorization),后端却返回 Access-Control-Allow-Origin: *,浏览器立刻报错:
Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'
解决方法只有两个:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 后端把
Access-Control-Allow-Origin改成具体域名,例如https://myapp.com或http://localhost:5173 - 前端去掉
credentials: 'include'(但意味着无法传身份凭证) - 注意:Nginx 或 Ingress 中用
$http_origin动态回写时,要确保预检请求(OPTIONS)也走同一套逻辑,否则可能漏掉头
Vite dev server proxy 只在开发期有效,且不解决真实 CORS
Vite 的 server.proxy 是前端开发绕过浏览器同源限制的临时方案,它本质是让请求“不跨域”:
- 浏览器向
http://localhost:5173/api/users发请求 → Vite 开发服务器收到 → 它以服务端身份转发到https://prod-api.example.com/users - 关键配置
changeOrigin: true必须开启,否则目标服务可能因Host头不匹配而拒收 - 这个 proxy 在
vite build后完全失效,上线必须切回真实 API 地址,或靠 Nginx / CDN 层加 CORS 头 - 别在 proxy 配置里加
headers去伪造Access-Control-Allow-Origin—— 浏览器只认最终上游服务的响应头,proxy 层加的头它压根不看
预检请求(OPTIONS)失败,主请求根本不会发出
当请求带自定义 header(如 Authorization)、非简单 Content-Type(如 application/json),或用 PUT/DELETE 方法时,浏览器会先发一个 OPTIONS 预检请求。如果这个请求失败,后续的 GET/POST 根本不会发出去。
常见现象:
- Network 面板只看到
OPTIONS返回 404 / 405 / 500,没有后续请求 - 控制台报错类似:
Request header field content-type is not allowed by Access-Control-Allow-Headers - Spring Boot 2.4+ 默认不处理全局 OPTIONS,
@CrossOrigin注解可能无效,得配CorsConfigurationSourceBean - Nginx 配置需显式拦截
OPTIONS并返回 204,同时带上所有必要 CORS 头(包括Access-Control-Allow-Headers、Access-Control-Allow-Methods)
真正难调的不是 fetch 怎么写,而是预检是否被后端放行、Access-Control-Expose-Headers 是否漏配、以及 credentials 和 * 的冲突——这些细节一错,连请求都发不出去,更别说读数据了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










