一、故事开场:一次“看似相同”的跳转
想象你在商场里问服务员:“请问洗手间在哪里?”
场景 A:服务员亲自带你穿过走廊,推开洗手间的门——你始终没离开他的视线。
场景 B:服务员抬手一指:“前方 50 米左转,门上写着 WC。”——你根据指示自己走过去。
在 Web 世界里,场景 A 就是“转发”,场景 B 就是“重定向”。两者都能让你最终到达洗手间,但路径、感知、责任截然不同。
二、回到 HTTP:两条指令的语义差异
1. 转发(Forward)
发生在服务端内部。客户端只发一次请求,服务器内部把请求交给另一个资源继续处理,再把结果沿原链路返回。客户端地址栏不变,浏览器无感知。
2. 重定向(Redirect)
服务端返回 3xx 状态码 + Location 头,浏览器收到后主动再发一次新请求。地址栏更新,用户明显感知“跳了”。
三、生命周期:一次往返 vs 两次往返
- 转发:浏览器 → 服务器 A → 服务器内部 B → 服务器 A → 浏览器
- 重定向:浏览器 → 服务器 A → 浏览器 → 服务器 B → 浏览器
多出来的一跳,决定了性能、缓存、SEO、安全等后续差异。
四、状态码家族:3xx 的暗语
- 301 Moved Permanently:永久搬家,权重传递。
- 302 Found:临时搬家,早期浏览器实现混乱。
- 303 See Other:改用 GET 重新获取。
- 307 Temporary Redirect:严格保留原方法(POST 仍是 POST)。
- 308 Permanent Redirect:永久且保留原方法。
转发则无特殊状态码,返回 200 即可。
五、地址栏与用户体验
转发:URL 不变,适合内部整合。
重定向:URL 更新,用户可收藏、分享,符合“资源搬家”语义。
六、性能维度:延迟、吞吐、缓存
- 延迟:重定向多一次往返;转发仅增加服务器内部调用。
- 吞吐:重定向可把流量打散;转发集中在一台机器。
- 缓存:重定向响应可缓存;转发结果随正常 200 一起缓存。
七、安全视角:开放面与攻击面
转发:隐藏内部路径,减少暴露;风险在于 SSRF、路径穿越。
重定向:天然隔离,但需校验 Location,防止开放重定向钓鱼。
八、SEO 地图:权重与收录
- 301/308:权重传递,适合域名迁移。
- 302/307:权重不传递,仅临时跳转。
- 转发:权重集中,不影响索引。
九、典型场景对照
转发
- 网关统一入口:/api/* 转发到微服务
- 服务端渲染:把请求内部交给模板引擎
- 权限校验:先鉴权,再转发到业务服务
重定向
- 旧域名整站迁移
- 登录后跳转到用户中心
- 短链接跳转
十、缓存与 CDN 的联动
转发对 CDN 无感知;重定向响应可被 CDN 缓存。若用 302 做 A/B 测试,需加 Cache-Control: no-cache。
十一、移动端与 SPA 的特殊舞步
- 短链接跳转:302 到 SPA 路由,前端再解析。
- 服务端渲染:内部转发渲染后一次性返回,减少白屏。
十二、性能调优组合拳
- 减少重定向:合并多级跳转。
- 域名收敛:减少 DNS 查询。
- 预连接:提前建立 TCP+TLS。
十三、安全加固清单
- 白名单校验:Location 域名白名单。
- 日志留存:记录 3xx 响应。
- 灰度发布:302 转 301 固化。
十四、结语:让流量找到最合适的归宿
转发像高速公路,追求速度;重定向像机场安检,追求精准。
真正的高可用系统,让两者在各自领域发光发热:
- 四层负责快,七层负责灵;
- 四层负责稳,七层负责智。
当下一次站在架构图前,不妨问自己:这条链路需要的是“收费站”还是“安检口”?