Vite Proxy到底是咋个工作嘞?

proxy 要不要写、rewrite 要不要写、axios 的请求路径该怎么写?我好乱啊!!!

你是不是也经常遇到类似的问题,搞不清路径到底该咋个写,今天就让你学个明明白白的。

一、先用一句话说清 Proxy 在干嘛

Vite Proxy = 本地开发时的"请求中转站"

它做的事情只有一件:

把浏览器发给本地的请求,偷偷转发到真正的后端服务器


为什么需要它?

因为浏览器有 跨域限制

arduino 复制代码
前端:http://localhost:5173
后端:http://192.168.110.220:8888

err:直接请求会被浏览器拦掉

Proxy 的作用就是:
浏览器只跟 Vite 说话,Vite 去跟后端说话,通俗来讲,就是vite中封装的Proxy是个媒婆,你跟后端是相亲的,你的话需要通过媒婆来传递给后端。


二、Proxy 的工作流程(一定要理解)

假设你在浏览器里请求:

bash 复制代码
http://localhost:5173/api/csr/generate

Vite Proxy 做的事是:

bash 复制代码
浏览器
  ↓
Vite 开发服务器(localhost:5173)
  ↓(匹配 /api 规则)
代理转发
  ↓
真正后端(192.168.110.220:8888)

⚠️ 重点:
Proxy 只在「开发环境」生效,生产环境完全无效


三、Proxy 配置里最重要的 3 个东西

yaml 复制代码
proxy: {
  '/api': {
    target: 'http://192.168.110.220:8888',
    changeOrigin: true,
    rewrite: ...
  },
}

我们一个一个讲。


1. /api ------「拦谁」

arduino 复制代码
'/api'

意思是:

只要请求路径是以 /api 开头的,才走代理

例如:

请求路径 是否走代理
/api/csr/generate
/api/user/login
/csr/generate
/login

2. target ------「转给谁」

rust 复制代码
target: 'http://192.168.110.220:8888'

意思是:

最终请求会发给哪个后端服务器


3.rewrite ------「要不要改路径」

这是最容易迷糊的地方,但其实逻辑非常简单。


四、rewrite 的本质(一句话)

rewrite = 把"前端请求路径"改成"后端能识别的路径"

如果前端路径和后端路径 一模一样

❌ 不需要 rewrite

如果不一样:

✅ 才需要 rewrite


五、最重要的前提:先搞清"后端真实接口长什么样"

我们用你真实的接口来讲:

ruby 复制代码
后端真实接口:
http://192.168.110.220:8888/api/csr/generate

👉 注意:
/api 是后端接口的一部分


六、场景一(最推荐):/api 只是前端代理前缀

场景描述

bash 复制代码
后端接口:/csr/generate
前端想统一写:/api/xxx

正确配置

vite.config.ts

javascript 复制代码
proxy: {
  '/api': {
    target: 'http://192.168.110.220:8888',
    changeOrigin: true,
    rewrite: path => path.replace(/^/api/, ''),
  },
},

axios

arduino 复制代码
// baseURL
'/api'

// 请求
api.post('/csr/generate')

实际发生的事

bash 复制代码
/api/csr/generate
↓ rewrite
/csr/generate
↓
192.168.110.220:8888/csr/generate

✅ rewrite 有意义


七、场景二(⭐你现在的真实场景):/api 是后端真实路径

场景描述

bash 复制代码
后端接口:/api/csr/generate
前端请求:/api/csr/generate

👉 前后端路径完全一致


正确配置(最简单、最不容易出错)

vite.config.ts

arduino 复制代码
proxy: {
  '/api': {
    target: 'http://192.168.110.220:8888',
    changeOrigin: true,
    // ❌ 不写 rewrite
  },
},

axios

arduino 复制代码
// baseURL
'/api'

// 请求
api.post('/csr/generate')

实际请求路径

bash 复制代码
localhost:5173/api/csr/generate
↓
192.168.110.220:8888/api/csr/generate

✅ 完全正确

✅ 不多、不少

✅ 不 404


八、为什么 rewrite: replace(/^/api/, '/api') 没意义?

我们来算一遍:

javascript 复制代码
'/api/csr/generate'.replace(/^/api/, '/api')

结果还是:

bash 复制代码
/api/csr/generate

👉 路径根本没变

所以:

  • ✔️ 写了不报错
  • ❌ 但等于没写
  • ❌ 还容易误导别人

九、axios 和 proxy 配合的"黄金规则"

一句话口诀(非常重要)

baseURL 里有 /api,请求路径里就不要再写 /api


正确示例

css 复制代码
baseURL: '/api'
api.post('/csr/generate')

错误示例(最常见 404 来源)

arduino 复制代码
baseURL: '/api'
api.post('/api/csr/generate') // ❌

实际请求变成:

bash 复制代码
/api/api/csr/generate

十、不同配置组合对照表(建议收藏)

baseURL axios 请求 实际请求
/api /csr/generate /api/csr/generate
/api /api/csr/generate /api/api/csr/generate
/ /api/csr/generate /api/csr/generate

十一、完整推荐模板(开发 + 生产)

.env.development

ini 复制代码
VITE_API_BASE_URL=/api

.env.production

ini 复制代码
VITE_API_BASE_URL=http://192.168.110.220:8888

axios 封装

javascript 复制代码
import axios from 'axios'

export default axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 10000,
})

十二、最后用一句大白话收尾

Proxy 不神秘,它只是帮你"改地址";
axios 不复杂,它只是"拼路径";
你只要分清:
👉 /api 是不是后端真实路径,
👉 rewrite 就永远不会再写错。

相关推荐
Hello--_--World1 小时前
利用CDN进行首屏优化。能不能看CDN与本地服务器谁快用谁?
运维·服务器·前端·javascript·vite
Hello--_--World2 小时前
为什么 用vite进行分包后,可以通过 浏览器强制缓存 提高性能?路由懒加载进行的分包与 vite进行的分包有什么不同?
前端·javascript·缓存·vite
xChive2 小时前
前端请求取消:用 AbortController 从 fetch 到 axios
前端·vue.js·axios·fetch·abortcontroller
Patrick_Wilson2 天前
Vite+ vs nvm:一次「全局 CLI 失踪」事故引出的 Node 工具链选型
node.js·vite·前端工程化
真夜2 天前
开发正常但生产异常的 Bug:Vite manualChunks 循环依赖导致 ReferenceError
前端·前端框架·vite
豹哥学前端3 天前
前端工程化实战:从包管理到 Vite 配置,一套下来全明白
前端·javascript·vite
辞忧九千七5 天前
前后端分离架构实战与项目落地:AI智能学习笔记管理系统
python·html·axios·css3·fastapi·dify
rising start5 天前
InsightEdu - 轻量智能学习平台
javascript·axios·css3·html5·fastapi·orm·dify
天渺工作室5 天前
构建完自动打包压缩,一个插件搞定 Vite / Webpack / Rollup / ESBuild
webpack·vite·rollup.js
Hello--_--World6 天前
Vite:什么是bundleless?哪些要打包,哪些不要打包?依赖预构建是什么?依赖预构建如何减少网络请求的?esbuild 又是什么?
前端·javascript·webpack·vite