Vite配置代理和后端服务器CORS

核心区别:作用的环境完全不同

  • Vite 代理(Proxy) :只在你的电脑本地开发时(运行 npm run dev)有效。它其实是启动了一个本地 Node 服务器充当"中间人"。
  • 后端 CORS:是服务器端实打实的跨域配置,主要在生产环境(线上)发挥作用。

Vite 代理是怎么绕过跨域的?

跨域限制是浏览器的安全机制,但服务器之间互相发请求是没有这个限制的。

Vite 代理就是利用了这一点。在 vite.config.js 里配置后,前端发的请求其实都发给了本地的 Vite 开发服务器,Vite 收到后,再帮你把请求转发给真实的后端 API。

对于浏览器来说,它只看到向同一个域名(比如 localhost:5173)发了请求,觉得是同源的,自然就不会报错了。

JavaScript 复制代码
// vite.config.js
export default {
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true, // 骗过服务端,让它以为请求就是从 target 域名发出的
        rewrite: (path) => path.replace(/^/api/, '')
      }
    }
  }
}

本地开发时,两者冲突吗?

不冲突,但实际开发中通常只选其一。

  1. 最推荐的做法:前端配代理,后端不配 CORS。

    这样做后端代码最干净,不需要专门为了配合前端本地调试去改跨域配置。这也更贴近真实的生产环境安全策略。

  2. 冗余的做法:前端配代理,后端也配 CORS。

    能跑通,但后端的 CORS 相当于没用上,因为浏览器根本没做跨域拦截。

  3. 体验稍差的做法:前端不配代理,全靠后端 CORS。

    前端直接请求 localhost:3000。虽然能工作,但每次复杂请求都会多出一步 OPTIONS 预检请求,看着有点繁琐。

生产环境怎么办?

Vite 的 proxy 配置在 npm run build 打包后就彻底失效了!

打包出来的产物只是一堆纯静态的 HTML/JS/CSS 文件。当把它们丢到服务器上后,就不存在 Vite 这个"中间人"了,代码里请求的 /api/users 就是直接向当前域名发起的。

所以在生产环境,解决跨域只能靠下面两招:

方案一:Nginx 反向代理(最常用,相当于线上的 Vite Proxy)

把前端静态文件和后端接口放在同一个域名下,通过 Nginx 按路径分发请求,这样浏览器看来依旧是同源的。

bash 复制代码
server {
    listen 80;
    server_name myapp.com;

    # 1. 访问网页,返回前端静态页面
    location / {
        root /var/www/frontend;
        try_files $uri /index.html;
    }

    # 2. 访问 /api,转发给后端服务
    location /api/ {
        proxy_pass http://backend:3000/;
    }
}

方案二:后端老老实实配 CORS

如果前端托管在 CDN 上,或者前后端域名注定不一样(比如前端 www.myapp.com,后端 api.myapp.com),那就必须让后端加上跨域头,指定允许你前端的线上域名访问:

JavaScript 复制代码
// 后端代码示例
app.use(cors({
  origin: 'https://www.myapp.com', // 写死前端的线上域名
  credentials: true,
  methods: ['GET', 'POST', 'PUT', 'DELETE']
}))

一句话总结

开发环境靠 Vite 代理 当中间人绕过浏览器限制,生产环境靠 Nginx 转发 或后端 CORS 来处理真实的跨域问题。两者是不同开发阶段的解决方案,各司其职。

相关推荐
Moment39 分钟前
写给迷茫的应届生,怎样在 AI 时代争取更多机会
前端·后端·面试
Rain的Java大神之路6 小时前
你背的Spring答案,全是5.x时代的:7.0.8源码一翻,80%的博客都过时了
java·后端·面试
聪明的笨猪猪7 小时前
实际工程问题:AI生成MyBatis批量操作的SQL超限与性能雪崩
java·经验分享·面试·ai编程
lsc_blog13 小时前
年终自评别贴提交记录,把技术产出讲成变化
数据库·面试·职场和发展·跳槽·求职招聘
GoAI19 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Zan20 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
我叫黑大帅21 小时前
PHP 常驻 Worker 中 MySQL 连接中断问题报告
后端·面试·php
Moment1 天前
代码都能让 Agent 写了,我们为什么还要学前端?
前端·后端·面试
聪明的笨猪猪1 天前
实际工程问题:AI生成Redis分布式锁的原子性缺陷导致库存超卖
java·经验分享·面试·ai编程
时间的拾荒人1 天前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试