访问前端页面 https://<your-domain>/datasets 时,静态资源能加载,但数据集列表 API 失败。浏览器 Network 里表现为跨域错误;排查过程中还短暂出现过 502。

前端请求 API 时会拼接 NEXT_PUBLIC_API_PREFIX:
const urlPrefix = isPublicAPI ? PUBLIC_API_PREFIX : API_PREFIX let urlWithPrefix = (url.startsWith('http://') || url.startsWith('https://')) ? url : `${urlPrefix}${url.startsWith('/') ? url : `/${url}`}`最初配置(有问题):
| 项目 | 值 |
|---|---|
| 页面 | https://<your-domain>/datasets |
| API | http://<your-domain>/vector/v2/collections/get-all |
协议不同(https vs http),浏览器视为不同 Origin,即使域名相同也会跨域。
同时触发两个问题:
所以控制台看起来像 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_PREFIX=https://<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_PREFIX=https://<your-domain>
app_.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, ... )
allow_origins=["*"] + allow_credentials=True 按规范不能同时使用。同域部署下 CORS 基本用不到;如果以后要跨域 + 带 Cookie,需要改成具体 Origin 列表。
/vector 时,API 前缀留空最省事。NEXT_PUBLIC_* 必须 rebuild web,否则浏览器可能还在用旧 JS。一句话:页面是 HTTPS,API 前缀却配成了 HTTP,浏览器判定跨域并拦截;换成与页面对齐的 URL 后,请求变成同域,问题消失。
给老项目加了 TypeScript: 本来只想自己爽: 结果全公司代码审查标准被我抬高了
vue 甘特图 vxe-gantt 小时视图设置日期轴每间隔 3 个小时
手把手教你实现发布订阅模式--Vue源码
完整技术指南:Highcharts for Vue
从 17MB 的 Vendor 大包到按需加载:Vite 多入口 Vue 组件库首屏优化实践
vue 甘特图 vxe-gantt 实现日期轴跨度间隔:让时间轴密度更合理