Vue前端使用请求转发,接口代理

66 阅读3分钟

在 Vue 项目中,URL 转发(也称为接口代理、请求转发)的核心目的是解决跨域问题(浏览器同源策略限制),通过本地开发服务器将前端请求转发到目标后端接口,避免跨域报错。以下是基于 Vue 生态的完整实现方案,涵盖核心配置、进阶用法和生产环境处理。

一、核心实现:Vue CLI 项目(最常用)

Vue CLI 内置  webpack-dev-server ,通过  devServer.proxy  配置即可实现本地转发,无需额外安装依赖。

  1. 基础配置(单接口转发)

修改项目根目录的  vue.config.js (若不存在则新建),添加 proxy 配置:

javascript

module.exports = { devServer: { // 开发服务器端口(默认8080,可自定义) port: 8081, // 代理配置 proxy: { // 1. 匹配请求路径的前缀(如 /api 开头的请求都会被转发) '/api': { target: 'http://localhost:3000', // 2. 目标后端接口地址(真实接口域名/IP) changeOrigin: true, // 3. 开启跨域(关键:让后端认为请求来自同源服务器) pathRewrite: { // 4. 路径重写(可选):去掉请求路径中的 /api 前缀 '^/api': '' } } } } }  

  1. 配置说明
  • 匹配规则( /api ):前端发送的请求路径若以  /api  开头,会触发代理。例如:
  • 前端请求  http://localhost:8081/api/user  → 转发到  http://localhost:3000/user (因  pathRewrite  去掉了  /api )。
  •  changeOrigin: true :必须开启,否则后端会因跨域拒绝请求(模拟同源请求的  Host  头)。
  •  pathRewrite :可选,若后端接口本身就包含  /api  前缀(如  http://localhost:3000/api/user ),则无需重写(删除该配置)。
  1. 多接口转发(多目标地址)

若需转发到多个不同后端接口,可配置多个匹配规则:

javascript

proxy: { // 第一组:/api 开头转发到后端服务A '/api': { target: 'http://localhost:3000', changeOrigin: true, pathRewrite: { '^/api': '' } }, // 第二组:/admin 开头转发到后端服务B '/admin': { target: 'http://localhost:3001', changeOrigin: true, // 后端接口本身带 /admin 前缀,无需重写 }, // 第三组:/third-party 开头转发到第三方接口 '/third-party': { target: 'api.xxx.com', changeOrigin: true, pathRewrite: { '^/third-party': '' }, secure: false // 若目标接口是 https 且证书无效(如测试环境),需关闭 SSL 校验 } }  

二、进阶用法:动态转发与特殊场景

  1. 基于环境变量切换目标地址

通过  .env  文件区分开发/测试环境,避免硬编码:

  • 新建  .env.development (开发环境): env

VUE_APP_API_BASE_URL=/api # 本地代理前缀 VUE_APP_TARGET_URL=http://localhost:3000 # 开发环境后端地址  

  • 新建  .env.test (测试环境): env

VUE_APP_API_BASE_URL=/api VUE_APP_TARGET_URL=test.xxx.com # 测试环境后端地址  

  • 修改  vue.config.js : javascript

module.exports = { devServer: { proxy: { [process.env.VUE_APP_API_BASE_URL]: { target: process.env.VUE_APP_TARGET_URL, changeOrigin: true, pathRewrite: { [^${process.env.VUE_APP_API_BASE_URL}]: '' } } } } }  

  1. 自定义请求头/拦截转发

若需在转发时添加自定义头(如授权信息、版本号),可通过  onProxyReq  配置:

javascript

proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true, onProxyReq: (proxyReq) => { // 给转发的请求添加自定义头 proxyReq.setHeader('X-Proxy-Version', '1.0.0'); // 若需携带 Cookie,需开启 withCredentials(前端请求也要配置) proxyReq.setHeader('Cookie', 'token=xxx'); } } }  

  1. 前端请求配置(配合 Axios)

转发生效后,前端请求需以配置的前缀(如  /api )开头,示例:

javascript

// 1. 安装 Axios:npm install axios // 2. 配置请求实例(src/utils/request.js) import axios from 'axios';

const service = axios.create({ baseURL: process.env.VUE_APP_API_BASE_URL, // 对应代理前缀 /api timeout: 5000, withCredentials: true // 若需携带 Cookie,需开启(配合后端 CORS 配置) });

// 3. 发送请求 service.get('/user') // 实际请求:/api/user → 转发到目标接口 .then(res => console.log(res)) .catch(err => console.error(err));  

三、非 Vue CLI 项目(如 Vite + Vue 3)

Vite 内置代理功能,配置方式与 Vue CLI 类似,修改  vite.config.js :

javascript

import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue';

export default defineConfig({ plugins: [vue()], server: { port: 8081, proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true, rewrite: (path) => path.replace(/^/api/, '') // Vite 中用 rewrite 替代 pathRewrite } } } });  

四、生产环境的 URL 转发处理

本地代理仅适用于开发环境( devServer / server  仅在开发时生效),生产环境需通过以下方式处理:

1. 后端配置 CORS:最推荐方案,让后端在响应头中添加跨域允许配置(如  Access-Control-Allow-Origin: * ),前端直接请求真实接口,无需转发。 2. Nginx 反向代理:若后端无法修改,可通过 Nginx 部署前端时配置转发: nginx

server { listen 80; server_name 前端域名(如 www.xxx.com);

前端静态资源目录

root /path/to/vue/dist; index index.html;

转发 /api 开头的请求到后端

location /api { proxy_pass http://localhost:3000; # 后端真实地址 proxy_set_header Host host;proxysetheaderXRealIPhost; proxy_set_header X-Real-IP remote_addr; } }   3. 前端动态切换 BaseURL:生产环境直接指向真实接口域名,无需代理: javascript

// src/utils/request.js const service = axios.create({ // 开发环境用代理前缀,生产环境用真实接口域名 baseURL: process.env.NODE_ENV === 'production' ? 'api.xxx.com' : process.env.VUE_APP_API_BASE_URL, timeout: 5000 });  

五、常见问题排查

1. 转发不生效:

  • 检查  vue.config.js / vite.config.js  配置是否正确(匹配前缀、target 地址)。
  • 重启开发服务器(配置修改后需重启)。
  • 查看浏览器 Network 面板,确认请求 URL 是否为  http://localhost:8081/api/xxx (而非直接指向目标地址)。 2. 跨域仍报错:
  • 确保  changeOrigin: true  已配置。
  • 后端是否允许  OPTIONS  预检请求(跨域请求会先发送 OPTIONS 探测)。 3. HTTPS 接口转发失败:
  • 目标接口是 HTTPS 时,添加  secure: false (忽略 SSL 证书校验,仅测试环境使用)。

总结

Vue 项目的 URL 转发核心是开发环境用本地代理解决跨域,生产环境通过后端 CORS 或 Nginx 代理兜底。配置时需注意匹配前缀、目标地址、跨域开关三个关键参数,配合 Axios 基础路径可简化请求写法。

需要我帮你根据具体场景(如 Vue 2/Vue 3、单接口/多接口、开发/生产环境)生成完整的配置文件代码吗?