一、故事開場:一次“看似相同”的跳轉
想象你在商場里問服務員:“請問洗手間在哪里?”
場景 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 固化。
十四、結語:讓流量找到最合適的歸宿
轉發像高速公路,追求速度;重定向像機場安檢,追求精準。
真正的高可用系統,讓兩者在各自領域發光發熱:
- 四層負責快,七層負責靈;
- 四層負責穩,七層負責智。
當下一次站在架構圖前,不妨問自己:這條鏈路需要的是“收費站”還是“安檢口”?