uni-app H5开发跨域根本解法是配置manifest.json中"h5"→"devServer"→"proxy"代理,需正确设置target、changeOrigin、pathRewrite等字段,且前端请求URL必须严格匹配代理前缀。

uni-app 的 H5 端跨域问题,只在开发阶段(npm run dev:h5 或 HBuilderX 运行到浏览器)出现,上线部署后不存在。根本解法不是改后端或加 CORS,而是让开发服务器做代理转发——因为服务端之间通信不受同源限制。
manifest.json 里 proxy 配置必须写在 "h5" → "devServer" 下
很多人把 proxy 错放在 "network" 或顶层,导致完全不生效。正确路径是:
{
"h5": {
"devServer": {
"proxy": {
"/api": {
"target": "http://localhost:3000",
"changeOrigin": true,
"secure": false,
"pathRewrite": { "^/api": "" }
}
}
}
}
}
-
"h5"是 H5 独有配置入口,其他平台(App、小程序)不读这里 -
"devServer"是 Webpack/Vite 开发服务器专属字段,生产构建时被忽略 - 如果项目同时存在
vue.config.js和manifest.json中的 proxy,manifest.json优先级更高,后者会被覆盖
pathRewrite 不写或写错会导致 404
比如后端接口是 http://localhost:3000/user/info,你前端请求 /api/user/info,那 pathRewrite 必须把 /api 去掉,否则实际转发变成 http://localhost:3000/api/user/info —— 后端根本没这个路由。
- 正确:
"^/api": ""(推荐,彻底剥离前缀) - 错误:
"^/api": "/api"或漏掉pathRewrite - 如果后端要求保留
/dev-api前缀,那就写成"^/api": "/dev-api",但前端请求仍用/api/xxx
changeOrigin 和 secure 的取值要匹配目标服务协议
changeOrigin: true 是必须的,它会重写请求头中的 Host 字段为目标地址,否则有些后端(尤其是 Nginx 或带鉴权的网关)会直接拒绝。
- 目标是
http://:设"secure": false(默认值,可省略) - 目标是
https://:必须显式写"secure": true,否则代理会失败并报Error: self signed certificate -
"ws": false可选,仅当你需要代理 WebSocket 时才设为true,H5 普通 API 基本不用
请求 URL 必须和 proxy 规则前缀严格匹配
代理只对以配置路径开头的请求生效。比如配了 "/api",但你在代码里写了 uni.request({ url: '/v1/user' }),这个请求不会走代理,依然跨域。
- 前端所有 H5 请求 URL 必须以
/api开头(或你配置的其他前缀),例如:/api/user/login - 建议封装统一 baseURL:在
request.js中用条件编译区分环境:// #ifdef H5const BASE_URL = '/api'// #endif// #ifndef H5const BASE_URL = 'https://api.example.com'// #endif - 别信“配了代理就能随便写 URL”的说法——代理不改请求逻辑,只改转发行为
实际调试时最容易卡在 pathRewrite 和 baseURL 不一致上,多看控制台 Network 面板里请求的 Actual Request URL 和 Preview/Response Headers,比猜快得多。











