# 生产部署:nginx 需代理的接口 > 与 `dist/DEPLOY-nginx-proxy.md` 同源说明,便于仓库内查阅。 > 打生产包时请同步更新 `dist/` 内副本(或重新 `npm run build` 后覆盖写入)。 前端请求均为**同源路径**,协议由 nginx 决定(http/https)。 下列「参考上游」为开发/测试机地址,**政务网部署请改成内网实际地址与端口**。 ## 一、四条反向代理(必配) | 前端前缀 | 改写 | 参考上游(外网测试) | 用途 | |---|---|---|---| | `/chat-api/` | **剥掉** `/chat-api` | `http://192.168.2.23:8000` | 对话 SSE、企业分类 | | `/dms/` | **直通**(不改路径) | `http://121.43.55.7:10081` | DMS 数据 / 文件 / 政策库静态文件 | | `/oauth/` | **直通** | `http://121.43.55.7:10086` | 未登录访客换 DMS token | | `/api/` | **剥掉** `/api` | `http://121.43.55.7:10011` | 取本机 IP、NLS 语音 token | 说明: - 页面若是 HTTPS、上游是 HTTP,必须由 nginx 转发,浏览器不能直连上游(混合内容)。 - DMS 鉴权头名是 `token`(不是 `Authorization`)。前端会自己带;nginx **不要覆盖**已有 `token` 头(可选:请求未带时再注入兜底 token)。 ## 二、各前缀下前端实际调用的路径 ### 1. `/chat-api/` → 聊天后端(剥前缀后) | 方法 | 浏览器请求 | 上游真实路径 | |---|---|---| | `POST`(SSE) | `/chat-api/api/chat` | `/api/chat` | | `POST` | `/chat-api/api/company/classify` | `/api/company/classify` | 对应 env:`VITE_CHAT_API="/chat-api"` ### 2. `/dms/` → DMS(直通) | 方法 | 浏览器请求 | 上游真实路径 | |---|---|---| | `POST` | `/dms/content/selectContentList` | `/dms/content/selectContentList` | | `POST` | `/dms/content/addContent` | `/dms/content/addContent` | | `POST` | `/dms/content/updateContent` | `/dms/content/updateContent` | | `POST` | `/dms/content/updateAudit` | `/dms/content/updateAudit`(删除=改状态) | | `POST` | `/dms/file/uploadFile` | `/dms/file/uploadFile` | | `GET` | `/dms/static/file/…`(或 photo) | 同路径(政策库 json、附件预览) | 对应 env:`VITE_DMS_API="/dms"` 政策库远端相对路径见部署包内 `config.js` 的 `dms.policyRemotePath`。 ### 3. `/oauth/` → 登录服务(直通) | 方法 | 浏览器请求 | 上游真实路径 | |---|---|---| | `POST` | `/oauth/api/user/login` | `/oauth/api/user/login` | 对应 env:`VITE_OAUTH_LOGIN_URL="/oauth"`(代码再拼 `/api/user/login`) ### 4. `/api/` → 后端网关(剥前缀后) | 方法 | 浏览器请求 | 上游真实路径 | |---|---|---| | `GET` | `/api/proxy/verify/getIPByBrowser` | `/proxy/verify/getIPByBrowser`(纯文本 IP) | | `GET` | `/api/proxy/verify/getALYToken` | `/proxy/verify/getALYToken`(NLS token) | 对应 env:`VITE_GATEWAY_API="/api"` ## 三、不走 nginx 同源代理的请求 | 目标 | 说明 | |---|---| | `VITE_API`(当前 `//qingpu-data-api.metamaker.cn`) | 企业登录 / 企业信息,**绝对地址**,不经上述四条代理。内网若换网关需改 `.env.production` 后**重新构建**。 | | `wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1` | 阿里云实时语音;页面非安全上下文时麦克风入口已隐藏。 | | `https://zwdtuser.sh.gov.cn/…` | 一网通办企业登录(浏览器整页跳转);回跳白名单需另行对接。 | | 一网通办政策详情等外链 | `target=_blank` 打开,非 XHR。 | ## 四、nginx 配置示例(请替换 upstream) ```nginx # 静态前端(dist 目录) root /path/to/dist; index index.html; location / { try_files $uri $uri/ /index.html; } # 对话后端 —— 剥 /chat-api location /chat-api/ { proxy_pass http://<对话机>:<端口>/; # 注意末尾 /,等价剥前缀 proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header Connection ""; proxy_buffering off; # SSE 建议关闭缓冲 proxy_read_timeout 3600s; } # DMS —— 直通(保留 /dms 前缀) location /dms/ { proxy_pass http://:<端口>; # 无末尾 /,把完整 URI 转给上游 proxy_set_header Host $host; # 可选:仅当客户端未带 token 时注入兜底(勿覆盖前端已带的 token) } # OAuth —— 直通 location /oauth/ { proxy_pass http://:<端口>; proxy_set_header Host $host; } # 网关 —— 剥 /api location /api/ { proxy_pass http://<网关机>:<端口>/; # 末尾 / 剥掉 /api proxy_set_header Host $host; } ``` ## 五、部署后建议自检 ```bash # 网关 curl -sS "http://<站点>/api/proxy/verify/getIPByBrowser" curl -sS "http://<站点>/api/proxy/verify/getALYToken" # OAuth(应能打到业务层;假账号可能返回业务错误而非 502) curl -sS -X POST "http://<站点>/oauth/api/user/login" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "userName=x&password=x&clientId=0" # DMS(需有效 token 头才有数据) curl -sS -X POST "http://<站点>/dms/content/selectContentList" \ -H "Content-Type: application/x-www-form-urlencoded" \ -H "token: " \ -d "columnId=<栏目id>&page=0&pageSize=1" # 聊天(SSE,需按实际协议带 body) curl -sS -N -X POST "http://<站点>/chat-api/api/chat" \ -H "Content-Type: application/json" \ -d '{"thread_id":"ping","question":"ping"}' ``` ## 六、与运行时配置的关系 | 文件 | 作用 | |---|---| | 本包 `config.js` | DMS 栏目/模型 id、双 `c_` 开关、政策库 `policyRemotePath`(**部署后可改,无需重建**) | | 构建期 `.env.production` | `VITE_*` 同源前缀与 `VITE_API`(改完需重新 `npm run build`) | 当前 `config.js` 默认按**政务网**栏目配置;切互联网见文件内注释。