Skip to content

后端未挂 CORS,浏览器发出的每个请求都被拦在预检(后端日志里看不到,易误判成后端挂了) #139

Description

@johnnyzhang-eng

问题

后端目前没有挂 CORS 中间件,浏览器打不通

症状具有欺骗性:预检 OPTIONS 返回 405、响应里没有任何 access-control-* 头,而后端日志里连这条请求都看不到——请求被浏览器自己拦住了,根本没到服务端。现场第一反应通常是「后端挂了」,实际后端好好的,curl 直连一切正常。

这条挡住的是所有前后端联调:只要前端跑在浏览器里,每一个请求都过不去。

需要什么

  1. 来源可配置。部署环境的前端域名各不相同,写死在代码里意味着换个域名就要改代码重新构建镜像。
  2. 默认值要含 4173vite preview(本地跑真实生产构建)用的是 4173,vite dev server 才是 5173,两个不一样,只配一个会在"用生产构建自测"时踩坑。
  3. 预览域名的通配必须是显式开启,不能默认写死。后端要开 allow_credentials,此时写死一条形如 https://.*\.<平台>\.app 的正则,等于把带凭证的跨域请求放行给该平台上任意第三方应用;而且这种正则和显式配置的白名单是并列关系,配了白名单也关不掉它。

验收

  • 配了 WINDUP_CORS_ORIGINS 的来源能过预检,未配的陌生来源拿不到 access-control-allow-origin
  • 不配任何环境变量时,4173 与 5173 都能过
  • 预览域名正则默认不开;开启后只匹配配置的域名形态,不波及同平台其他域名

备注

原先这部分和容器化部署放在同一个 PR(#115)里,按评审意见拆开:本 Issue 只谈"浏览器能连上后端",容器化与 CD 归 #115

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions