h5端跨域是浏览器同源策略拦截所致,非代码或后端问题;开发阶段必须在manifest.json的"h5"→"devserver"→"proxy"层级配置代理,且需严格匹配路径、设置changeorigin: true并重启服务,否则90%配置无效。

changeOrigin: true,90% 的配置都白搭**。
manifest.json 里 proxy 配置必须嵌套在 h5.devServer 下
很多人把 proxy 直接写在 manifest.json 顶层或 network 字段里,结果完全不生效。UniApp 2.7+ 明确要求路径是:"h5": { "devServer": { "proxy": { ... } } }。
如果你用 HBuilderX 运行(非命令行),这个位置就是唯一生效入口。
常见错误:
• 写成 "network": { "proxy": { ... } } → 已废弃,忽略
• 写成 "h5": { "proxy": { ... } } → 缺少 devServer 层,不读取
• 没切到「源码视图」编辑,可视化界面会清空自定义字段
vite.config.ts 的 server.proxy 是命令行启动时的唯一路径
如果你用 npm run dev:h5 启动(比如接入了 Vite 插件或自建脚手架),manifest.json 里的 proxy 会被忽略,必须改 vite.config.ts:
• 配置位置是 defineConfig({ server: { proxy: { ... } } }),不是 build 或 preview
• rewrite 是函数,不是对象:rewrite: (path) => path.replace(/^\/api/, '')
• 正则里的 / 必须转义,/^/api/ 会报错,得写成 /^\/api/
• target 必须带协议,"localhost:3000" 不行,得写 "http://localhost:3000"
pathRewrite 或 rewrite 漏掉就 404
前端请求 /api/user,后端真实接口是 http://127.0.0.1:3000/user,那代理必须去掉 /api 前缀,否则转发过去的是 http://127.0.0.1:3000/api/user,后端根本没这条路由。
manifest.json 写法:"pathRewrite": {"^/api": ""}(字符串正则,不能写 /^\/api/)
vite.config.ts 写法:rewrite: (path) => path.replace(/^\/api/, '')
如果后端接口本身带前缀(比如 http://xxx.com/v1/login),而你配的是 /api,那就得写成 "^/api": "/v1" 或 rewrite: (path) => path.replace(/^\/api/, '/v1')
changeOrigin: true 不开,Host 头不对,后端直接拒收
很多后端(Spring Boot、Nginx、Koa)默认校验请求头里的 Host 字段。代理转发时,如果不改 Host,浏览器发来的请求头还是 Host: localhost:8080,后端一看不是自己域名,直接返回 403 或 404。changeOrigin: true 的作用就是把 Host 改成 target 的域名(比如 localhost:3000)。
另外:
• 目标是 https:// 时,必须加 secure: true,否则报 Error: self signed certificate
• 请求 URL 必须和代理前缀严格一致:配了 /api,代码里却写 /v1/user,这个请求压根不走代理,照样跨域
• 改完配置后,必须停止并重新运行服务——热更新不会重载 proxy 规则
npm run dev:h5 或 HBuilderX「运行到浏览器」生效;build 出来的静态文件部署到 Nginx 后,这些配置全部失效,必须另配反向代理**。











