开发时需在 vite.config.ts 中配置 server.proxy 实现跨域代理,如 '/api' 代理至 'http://127.0.0.1:3000' 并设 changeOrigin: true;生产环境须用 Nginx/Apache 反向代理,proxy 配置仅限开发生效。

uni-app H5端跨域报错 CORS 怎么办
uni-app 的 H5 端本质是运行在浏览器里,发起的请求受同源策略限制。开发时直接访问后端接口(比如 http://localhost:3000/api/user)会触发 CORS 错误,不是 uni-app 本身的问题,而是浏览器拦住了——它不认你本地服务和后端服务是“一家的”。
解决思路只有一条:让开发服务器(npm run dev:h5 启动的 vite/h5 server)帮你把请求转发过去,伪装成同源请求。生产环境不能靠代理,但开发阶段必须配好这个。
- 代理只在
npm run dev:h5下生效,build 后的静态文件部署到 Nginx/Apache 时需另配反向代理 - uni-app 的 H5 模式用的是 Vite,所以代理配置写在
vite.config.ts或vite.config.js里,不是vue.config.js - 别往
manifest.json或h5.devServer字段里塞代理配置——那个字段已废弃,v3.0+ 不再识别
怎么配 server.proxy 让请求通
打开项目根目录的 vite.config.ts(没有就新建),在 defineConfig 的 server 选项里加 proxy:
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://127.0.0.1:3000',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
}
})
-
/api是前端请求的前缀,比如你写uni.request({ url: '/api/user' }),就会被代理 -
target必须带协议(http://或https://),不能只写localhost:3000,否则报Error: Invalid URL -
changeOrigin: true是关键,它改写请求头中的Host,让后端以为请求真来自目标域名 - 如果后端要求路径保留
/api,就删掉rewrite;多数 REST API 需要删掉,否则后端收不到/api/xxx
为什么 uni.request 还是 404 或 504
代理配了但请求仍失败,大概率是路径或协议没对上,而不是代码逻辑问题。
- 检查浏览器 Network 面板:如果看到请求发到了
http://localhost:8080/api/user(没被代理),说明 proxy 规则没匹配上——确认你请求的 URL 确实以/api开头,且没拼错大小写 - 如果看到请求发到了
http://127.0.0.1:3000/user但返回 504,说明后端根本没起来,或者target地址不通(比如后端监听127.0.0.1,但你写了localhost,某些系统 DNS 解析会失败) - 后端是 Express/Koa?确保它没加
cors()但又限制了 origin——开发时可临时设origin: true或明确允许http://localhost:8080 - uni-app 的
uni.request默认不带 cookie,如果后端依赖 session,得加withCredentials: true,同时后端cors配置也要允许凭据
上线后跨域问题怎么处理
build 出来的 H5 是纯静态文件,扔到任何 HTTP 服务器都跑,这时候代理配置完全失效。浏览器还是会直接请求你的后端域名,CORS 问题回归。
- 唯一合规解法:部署时让 Nginx/Apache 做反向代理,把
/api路径转给后端服务,前端代码不用改 - 千万别在生产环境用
jsonp或后端开全白名单*——前者不支持 POST/PUT,后者等于裸奔 - 如果后端就是你控制的,最省事是统一部署到同一个域名下,比如前后端都走
https://your.com,前端请求/api/xxx,Nginx 把带/api的请求转发给后端服务
代理只是开发期拐杖,上线就得切到真实网关或反向代理。很多人卡在这一步,是因为误以为 vite.config.ts 里的 proxy 能打包进生产包里——它真不能。

















