问题
后端目前没有挂 CORS 中间件,浏览器打不通。
症状具有欺骗性:预检 OPTIONS 返回 405、响应里没有任何 access-control-* 头,而后端日志里连这条请求都看不到——请求被浏览器自己拦住了,根本没到服务端。现场第一反应通常是「后端挂了」,实际后端好好的,curl 直连一切正常。
这条挡住的是所有前后端联调:只要前端跑在浏览器里,每一个请求都过不去。
需要什么
- 来源可配置。部署环境的前端域名各不相同,写死在代码里意味着换个域名就要改代码重新构建镜像。
- 默认值要含 4173。
vite preview(本地跑真实生产构建)用的是 4173,vite dev server 才是 5173,两个不一样,只配一个会在"用生产构建自测"时踩坑。
- 预览域名的通配必须是显式开启,不能默认写死。后端要开
allow_credentials,此时写死一条形如 https://.*\.<平台>\.app 的正则,等于把带凭证的跨域请求放行给该平台上任意第三方应用;而且这种正则和显式配置的白名单是并列关系,配了白名单也关不掉它。
验收
- 配了
WINDUP_CORS_ORIGINS 的来源能过预检,未配的陌生来源拿不到 access-control-allow-origin
- 不配任何环境变量时,4173 与 5173 都能过
- 预览域名正则默认不开;开启后只匹配配置的域名形态,不波及同平台其他域名
备注
原先这部分和容器化部署放在同一个 PR(#115)里,按评审意见拆开:本 Issue 只谈"浏览器能连上后端",容器化与 CD 归 #115。
问题
后端目前没有挂 CORS 中间件,浏览器打不通。
症状具有欺骗性:预检
OPTIONS返回 405、响应里没有任何access-control-*头,而后端日志里连这条请求都看不到——请求被浏览器自己拦住了,根本没到服务端。现场第一反应通常是「后端挂了」,实际后端好好的,curl直连一切正常。这条挡住的是所有前后端联调:只要前端跑在浏览器里,每一个请求都过不去。
需要什么
vite preview(本地跑真实生产构建)用的是 4173,vitedev server 才是 5173,两个不一样,只配一个会在"用生产构建自测"时踩坑。allow_credentials,此时写死一条形如https://.*\.<平台>\.app的正则,等于把带凭证的跨域请求放行给该平台上任意第三方应用;而且这种正则和显式配置的白名单是并列关系,配了白名单也关不掉它。验收
WINDUP_CORS_ORIGINS的来源能过预检,未配的陌生来源拿不到access-control-allow-origin备注
原先这部分和容器化部署放在同一个 PR(#115)里,按评审意见拆开:本 Issue 只谈"浏览器能连上后端",容器化与 CD 归 #115。