前端反向代理解决后端端口访问限制问题总结
1. 问题背景 (Problem Background)
架构描述
- 前端架构: Vue 3 + Vite 开发服务器
- 后端架构: Python Flask API 服务
- 部署环境: Linux 服务器 (Remote Server)
网络约束 (Network Constraints)
- 开放端口: 仅 20201 (用于前端服务访问)。
- 受限端口: 5000 (后端 API 端口),防火墙策略未对公网/局域网开放,仅允许服务器本地 (localhost/127.0.0.1) 访问。
遇到的问题
前端代码运行在客户端浏览器中。当代码尝试直接发起 HTTP 请求至 http://<服务器IP>:5000/api/report 时,由于服务器防火墙拦截了对 5000 端口的外部连接,导致请求超时或连接被拒绝 (Connection Refused/Timeout),前端无法获取数据。
2. 解决方案 (Solution)
采用 反向代理 (Reverse Proxy) 模式。利用已开放的 20201 端口作为统一入口,由运行在服务器上的 Vite 开发服务器充当“中转站”,将特定路径(如 /api)的请求转发给本机的后端服务。
核心机制
浏览器不再直接通过 TCP/IP 连接后端端口,而是将请求发送给前端服务器,再由前端服务器通过内部回环网络 (Loopback Interface) 转发给后端。
流量拓扑图 (Traffic Topology)
修改前 (直连模式 - 失败):
graph LR Browser[浏览器 (客户端)] --X 1. 请求 http://IP:5000 (被防火墙拦截) X--> Firewall[服务器防火墙] Firewall --|阻断|--> Backend[后端 Flask (5000)]修改后 (反向代理模式 - 成功):
graph LR Browser[浏览器 (客户端)] -->|1. 请求 http://IP:20201/api/xxx| Vite[Vite Server (20201)] subgraph Server [Linux 服务器内部] Vite -->|2. 内部转发 http://localhost:5000/api/xxx| Backend[后端 Flask (5000)] Backend -->|3. 返回数据| Vite end Vite -->|4. 响应数据| Browser3. 实施步骤 (Implementation Steps)
步骤一:配置 Vite 反向代理
修改 frontend/vite.config.js,拦截 /api 开头的请求并转发到本地 5000 端口。
文件: frontend/vite.config.js
export default defineConfig({ server: { host: '0.0.0.0', port: 20201, // 前端对外暴露端口 proxy: { // 匹配规则:以 /api 开头的路径 '/api': { target: 'http://localhost:5000', // 转发目标:本机后端 changeOrigin: true, // 修改 Host 头,伪装成后端同域请求 // rewrite: (path) => path.replace(/^\/api/, '') // (可选) 若后端不包含 /api 前缀则需重写 } } }})步骤二:修改前端请求路径
将前端代码中的绝对路径(包含 IP 和端口)改为 相对路径。浏览器会自动使用当前页面的域名和端口(即 20201)发起请求,从而触发 Vite 的代理规则。
文件: frontend/src/App.vue
// 修改前 (直连,失败)// const response = await axios.post('http://192.168.2.230:5000/api/report', ...)
// 修改后 (走代理,成功)const response = await axios.post('/api/report', ...)4. 关键概念辨析 (Key Concepts)
**反向代理 (Reverse Proxy) vs 跨域 (CORS)
| 特性 | 反向代理 (Vite Proxy / Nginx) | 跨域资源共享 (CORS) |
|---|---|---|
| 生效位置 | 服务端 (Vite Server / Nginx) | 浏览器 (安全策略) |
| 解决痛点 | 1. 绕过端口/防火墙限制 (本案核心) 2. 隐藏后端真实架构 3. 规避同源策略 | 1. 允许浏览器跨域访问资源 2. 仅在网络连通但域名不同时有效 |
| 本案作用 | 决定性作用。建立了一条浏览器通往后端的物理通道。 | 辅助/失效。由于物理网络不通,CORS 配置本身无法解决连接问题。但在代理生效后,CORS 可作为后端的二道防线。 |
5. 结论
通过配置 Vite 的 server.proxy,我们将“前端请求后端”的跨网络访问问题,转化为“前端服务器请求后端服务器”的本地进程间通信 (IPC/Loopback) 问题,成功绕过了服务器防火墙对 5000 端口的入站限制。