
1. 为什么Postman能通而前端却跨域最近在项目里踩了个坑Postman测试后端接口完全正常但前端死活调不通。查了半天才发现是Vite的跨域配置出了问题。这种情况特别常见因为Postman是直接发请求不涉及浏览器安全策略而前端代码运行在浏览器里受同源策略限制。跨域问题的本质是浏览器出于安全考虑实施的限制。当你的前端应用运行在http://localhost:5173而接口在http://localhost:8090时虽然域名相同但端口不同浏览器就会拦截请求。这时候常见的错误提示包括CORS policy相关错误404 Not Found其实是跨域被拦截了ECONNREFUSED通常是代理配置错误我遇到最典型的情况是在vite.config.js里配了代理但浏览器还是报跨域错误。后来发现是host配置写成了0,0,0,0注意这里应该是0.0.0.0用逗号分隔是错的。这种细节问题特别容易忽略但会导致整个代理失效。2. Vite跨域配置的核心要点2.1 正确配置server.host在Vite中server.host决定了开发服务器监听的IP地址。常见配置问题包括错误写法host: 0,0,0,0逗号分隔错误正确写法host: 0.0.0.0或host: true如果你需要局域网其他设备访问应该用server: { host: 0.0.0.0, // 监听所有IP port: 5173 }但要注意设置为0.0.0.0时可能会和系统其他服务冲突比如你本地还跑了Nginx。这时候可以换用特定IPserver: { host: 127.0.0.1, // 仅限本机访问 port: 5173 }2.2 代理(proxy)配置详解代理配置是解决跨域的关键。常见错误是target地址写错// ❌ 错误写法地址格式错误 target: http://localhost/8090 // ✅ 正确写法 target: http://localhost:8090完整代理配置应该包含这些参数proxy: { /api: { target: http://your-api-server.com, changeOrigin: true, // 修改请求头中的host值 ws: true, // 代理WebSocket rewrite: path path.replace(/^\/api/, ) // 路径重写 } }特别注意changeOrigin这个参数当你的后端服务检查Host头时必须设置为true。我遇到过Nginx配置了域名验证前端没开这个选项导致403错误的情况。3. 调试过程中的常见陷阱3.1 端口冲突导致代理失败有时候明明配置正确但请求还是失败。这时候要检查前端开发服务器端口默认5173后端服务端口如8090系统已占用端口用netstat -ano查看我曾遇到80端口被系统服务占用的情况导致代理始终失败。解决方案是改用其他端口如8080关闭占用端口的服务3.2 WebSocket代理问题当你的应用使用WebSocket时需要特别注意proxy: { /socket: { target: ws://localhost:8090, ws: true // 必须显式开启 } }常见错误是忘记加ws://前缀或者没开ws: true。错误提示通常是[vite] ws proxy error: Error: connect ECONNREFUSED 127.0.0.1:803.3 路径重写(rewrite)的坑rewrite函数用不对会导致404// 假设接口真实路径是 /user/list // 但你想通过 /api/user/list 访问 // ❌ 错误写法多删了字符 rewrite: path path.replace(/^\/api\/user/, ) // ✅ 正确写法 rewrite: path path.replace(/^\/api/, )建议先在浏览器开发者工具的Network面板查看实际请求发出的URL后端接收到的URL需要后端配合打印日志4. 完整配置示例与验证方法4.1 推荐的基础配置这是我验证过可用的配置模板// vite.config.js export default defineConfig({ server: { host: 127.0.0.1, port: 5173, proxy: { /api: { target: http://localhost:8090, changeOrigin: true, ws: true, rewrite: path path.replace(/^\/api/, ) }, /socket: { target: ws://localhost:8090, ws: true } } } })4.2 逐步验证步骤当你的接口调不通时建议按这个顺序检查直接访问后端接口用浏览器或Postman直接访问http://localhost:8090/api/test确认后端正常检查代理路径在前端代码中发请求到/api/test在浏览器开发者工具查看实际发出的请求URL应该是http://localhost:5173/api/test响应状态码和返回数据查看Vite启动日志控制台会打印代理映射信息类似[vite] proxy /api - http://localhost:8090启用调试模式在启动命令前加DEBUGvite:*DEBUGvite:* vite4.3 生产环境注意事项开发环境用Vite代理但生产环境应该使用Nginx/Apache反向代理配置正确的CORS头禁用开发时的特定头如vite-dev相关典型Nginx配置location /api { proxy_pass http://backend-server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }5. 高级技巧与性能优化5.1 多环境配置方案实际项目通常需要区分环境// vite.config.js const apiMap { dev: http://localhost:8090, test: https://test.example.com, prod: https://api.example.com } export default defineConfig({ server: { proxy: { /api: { target: apiMap[process.env.NODE_ENV], // ...其他配置 } } } })启动时指定环境NODE_ENVtest vite5.2 代理性能优化当接口较多时可以合并同类接口proxy: { /api/user: { target: http://user-service }, /api/order: { target: http://order-service } }启用缓存适用于开发环境proxy: { /api: { target: http://localhost:8090, agent: new http.Agent({ keepAlive: true }) } }5.3 自定义中间件方案对于特殊需求可以添加自定义中间件server: { middlewareMode: true, configureServer(server) { server.middlewares.use(/special, (req, res) { // 自定义处理逻辑 }) } }这种方案适合需要处理特定路由或修改请求/响应体的场景。比如我曾经用它来实现接口mock功能在对接的后端还没完成时前端可以先用mock数据开发。