# 正向代理与反向代理

这是网络面试和实际开发中非常常见的问题，下面我会用**通俗语言 + 对比 + 图示 + 示例**来说明：

***

## 🧭 一、什么是正向代理（Forward Proxy）

> **客户端找不到服务器，就找代理帮忙访问**，这叫正向代理。

### ✅ 定义：

正向代理是客户端的代理，客户端通过代理服务器访问目标服务器，**服务器并不知道真正的客户端是谁**。

### ✅ 应用场景：

* 科学上网（翻墙）
* 内网访问公网
* 访问受限制的网站
* 开发中设置 HTTP/HTTPS 代理（如 npm 设置代理）

### 🧠 图示：

```
[客户端] → [正向代理服务器] → [目标服务器]
            ↑
     知道客户端是谁
```

### 🎯 举例：

* VPN / Shadowsocks / Clash
* curl 设置代理：

  ```bash
  curl -x http://127.0.0.1:7890 http://www.google.com
  ```

***

## 🛡️ 二、什么是反向代理（Reverse Proxy）

> **服务器不直接对外暴露，而是由代理统一对外服务**，这叫反向代理。

### ✅ 定义：

反向代理是服务器端的代理，**客户端访问代理服务器，由代理服务器决定将请求转发到哪个后端服务器**。客户端不感知后端结构。

### ✅ 应用场景：

* 负载均衡
* 后端服务隐藏 IP（提升安全性）
* SSL 统一终端（HTTPS）
* 动静分离、缓存加速

### 🧠 图示：

```
[客户端] → [反向代理服务器] → [多个真实后端服务器]
                             ↑
                    客户端不知道具体是哪个
```

### 🎯 举例：

* Nginx / Apache / HAProxy 做反向代理
* CDN（Cloudflare、阿里云 CDN）帮你隐藏源站
* 示例 Nginx 配置：

  ```nginx
  location /api/ {
      proxy_pass http://backend_server;
  }
  ```

***

## ✅ 正向 vs 反向 对比总结

| 特性           | 正向代理         | 反向代理             |
| ------------ | ------------ | ---------------- |
| 代理对象         | 客户端          | 服务器              |
| 客户端是否知道目标服务器 | ✅ 是          | ✅ 是              |
| 服务器是否知道客户端   | ❌ 否          | ✅ 是              |
| 应用方向         | 客户端突破访问限制    | 服务器架构优化、安全加速     |
| 常见用途         | 翻墙、内网访问公网、爬虫 | 负载均衡、隐藏服务、CDN 加速 |

***

## 🎓 面试时建议这样回答：

> 正向代理是“用户找不到服务器”，通过代理访问目标；反向代理是“服务器不直接暴露”，代理接收请求并转发到后端。\
> 正向代理隐藏的是客户端身份，反向代理隐藏的是服务器身份。

***
