nginx 配置导致跨域
问题复盘脱敏版现象访问前端页面https://your-domain/datasets时静态资源能加载但数据集列表 API 失败。浏览器 Network 里表现为跨域错误排查过程中还短暂出现过 502。根因不是 CORS 中间件没配而是 Origin 不一致前端请求 API 时会拼接NEXT_PUBLIC_API_PREFIXconst urlPrefix isPublicAPI ? PUBLIC_API_PREFIX : API_PREFIX let urlWithPrefix (url.startsWith(http://) || url.startsWith(https://)) ? url : ${urlPrefix}${url.startsWith(/) ? url : /${url}}最初配置有问题项目值页面https://your-domain/datasetsAPIhttp://your-domain/vector/v2/collections/get-all协议不同httpsvshttp浏览器视为不同 Origin即使域名相同也会跨域。同时触发两个问题Mixed ContentHTTPS 页面请求 HTTP 接口浏览器会拦截CORS 预检跨域 POST 需要服务端返回正确 CORS 头所以控制台看起来像 CORS 问题本质是API 前缀协议和页面不一致。架构上本来不需要跨域项目 Nginx 已做同域反代location /vector { proxy_pass http://api:8000; include proxy.conf; } ... location / { proxy_pass http://web:3000; include proxy.conf; }前端和 API 都在同一域名下只要 API 走相对路径/vector/...就是同域请求不需要 CORS。排查过程步骤操作结果1发现 API 走http://页面走https://确认跨域根因2改成NEXT_PUBLIC_API_PREFIXhttps://your-domain协议一致中间短暂 502部署/后端 moment 不可用与前缀逻辑无关3换成正确的 URL最终方案问题解决502 是网关 moment 连不上 API 后端重启、Pod 未 Ready 等不是 URL 写法本身导致的。最终方案把NEXT_PUBLIC_API_PREFIX改成与页面同协议、同域名的地址或留空走相对路径并重新构建 web 镜像NEXT_PUBLIC_*在 build 时打进 JS只改运行时 env 不 rebuild 可能仍用旧值。推荐配置NEXT_PUBLIC_API_PREFIX# 或NEXT_PUBLIC_API_PREFIXhttps://your-domain关于 CORS 中间件app_.add_middleware( CORSMiddleware, allow_origins[*], allow_credentialsTrue, ... )allow_origins[*]allow_credentialsTrue按规范不能同时使用。同域部署下 CORS 基本用不到如果以后要跨域 带 Cookie需要改成具体 Origin 列表。经验总结先对 Origin跨域先看页面和 API 的 scheme/host/port 是否一致不要先怀疑 CORS 中间件。同域反代优先Nginx 已反代/vector时API 前缀留空最省事。改NEXT_PUBLIC_*必须 rebuild web否则浏览器可能还在用旧 JS。502 ≠ CORS502 是网关到后端的问题和跨域是两类问题。一句话页面是 HTTPSAPI 前缀却配成了 HTTP浏览器判定跨域并拦截换成与页面对齐的 URL 后请求变成同域问题消失。