反向代理、重定向(redirect)和转发(forward)是 Web 开发中三种不同的资源跳转或请求处理机制。下面逐一拆解它们的核心逻辑与典型应用场景。
反向代理
核心:隐藏真实服务器、负载均衡、处理静态资源
反向代理站在服务器前面,代表一个或多个服务器处理客户端的请求。客户端只知道代理服务器的地址,并不知道背后真实服务器的存在。反向代理可以隐藏内部网络架构(更安全),还能实现负载均衡,进一步可以通过缓存静态内容加速访问。

对客户端来说,URL 请求始终是代理服务器的地址,比如 https://api.example.com,客户端感知不到真实地址。
重定向(Redirect)
核心:客户端的二次导航
当服务器收到一个请求后(例如 https://api.example.com),如果使用重定向,它会返回一个特定的 HTTP 状态码(如 301 永久重定向或 302 临时重定向)和一个新的 URL 地址(Location 头,如 https://api.example.com/home)给客户端浏览器。浏览器接收到这个响应后,会自动发起一个新的请求去访问那个新地址。在浏览器地址栏会看到网址发生了变化。重定向的目标 URL 可通过服务端主动记录,或客户端读取响应头(Location)来获取。

请求转发(Forward)
核心:服务器内部的接力,客户端完全无感知
请求转发是服务器内部的行为。当服务器收到请求后(http://example.com/user),它可以在不告知客户端的情况下,将请求在服务器内部传递给另一个 Servlet、JSP 或静态资源来处理(http://example.com/userInfo),最后由最后一个处理者将结果返回给客户端。整个过程对客户端是透明的,客户端只发起一次请求,且浏览器地址栏的 URL 不会改变。
对比
| 特性 |
反向代理(Reverse Proxy) |
重定向(Redirect) |
转发(Forward) |
| 行为主体 |
由代理服务器(如 Nginx)处理 |
由服务器(如 Tomcat)处理,主动通知客户端跳转 |
由服务器内部处理,客户端无感知 |
| 交互方式 |
客户端 → 代理服务器 → 目标服务器(客户端只与代理交互) |
客户端 → 服务器(接收重定向指令) → 新 URL 服务器(客户端主动发起新请求) |
客户端 → 服务器(内部转发到新资源) |
| URL 变化 |
客户端 URL 不变(始终显示代理服务器地址) |
客户端 URL 会变为重定向的目标 URL |
客户端 URL 不变(仍显示原始请求 URL) |
| 请求次数 |
1 次请求(客户端视角) |
2 次请求(客户端先发送原始请求,再发送跳转请求) |
1 次请求(客户端只发送 1 次,服务器内部处理) |
| 数据共享 |
无直接共享(代理与目标服务器需单独处理数据) |
无法共享请求数据(两次请求是独立的) |
可共享 request 域数据(同一请求上下文) |
| 典型场景 |
负载均衡、动静分离、隐藏真实服务器地址 |
登录后跳转到首页、旧 URL 迁移到新 URL |
MVC 框架中控制器跳转到视图(如 JSP) |
小结
-
技术选型:如需隐藏后端服务器、做负载均衡或统一入口,选择反向代理技术;如需告知浏览器资源已永久或临时移动到新位置,或者需要改变浏览器地址栏 URL,选择重定向技术;如需在同一应用内部完成跳转,且需要保持地址栏不变或传递请求参数,选择请求转发。
-
反向代理是代理服务器处理客户端请求进行转发,客户端请求 URL 不变。
-
重定向是服务端通知客户端跳转,客户端请求 URL 改变,目标 URL 可通过服务端主动记录,或客户端读取 location 响应头指定获取。
-
转发是服务器内部跳转,客户端无感知,URL 不变。
相关阅读:
参考文章:
- 反向代理,重定向,forward - 认真的刻刀 - 博客园
- 重定向与反向代理工作原理对比与核心区别 - 开发者社区 - 阿里云
|