URL 重定向是一種當實際資源捡鱼,如單個頁面拐叉、表單或者整個 Web 應(yīng)用被遷移到新的 URL 下的時候们何,保持(原有)鏈接可用的技術(shù)舒憾。
重定向原理
在 HTTP 協(xié)議中彬呻,重定向操作由服務(wù)器通過發(fā)送特殊的響應(yīng)(即 redirects)而觸發(fā)哑蔫。HTTP 協(xié)議的重定向響應(yīng)的狀態(tài)碼為 3xx 。瀏覽器在接收到重定向響應(yīng)的時候茬射,會采用該響應(yīng)提供的新的 URL ,并立即進行加載烘苹。大多數(shù)情況下躲株,除了會有一小部分性能損失之外片部,重定向操作對于用戶來說是不可見的镣衡。
下面是HTTP重定向的工作過程
在a中,Alice向www.joes-hardware.com發(fā)送了一條請求
GET /hammers.html HTTP/1.0
Host: www.joes-hardware.com
User-Agent: Mozilla/4.51 [en] (X11; U; IRIX 6.2 IP22)
在b中档悠,服務(wù)器沒有回送帶有HTTP狀態(tài)碼200的Web頁面主體廊鸥,而是回送了一個帶有HTTP狀態(tài)碼302的重定向報文(Location指明了新的訪問地址)
HTTP/1.0 302 Redirect
Server: Stronghold/2.4.2 Apache/1.3.6
Location: http://161.58.228.45/hammers.html
現(xiàn)在,在c中辖所,瀏覽器會用重定向URL重新發(fā)送請求惰说,這次會發(fā)送給主機161.58.228.45。
GET /hammers.html HTTP/1.0
Host: 161.58.228.45
User-Agent: Mozilla/4.51 [en] (X11; U; IRIX 6.2 IP22)
重定向映射可以劃分為三個類別:永久重定向缘回、臨時重定向和特殊重定向吆视。永久性重定向操作是永久性的。它表示原 URL 不應(yīng)再被使用酥宴,而應(yīng)該優(yōu)先選用新的 URL啦吧。搜索引擎機器人會在遇到該狀態(tài)碼時觸發(fā)更新操作,在其索引庫中修改與該資源相關(guān)的 URL 拙寡,這種情景服務(wù)器的返回狀態(tài)碼為301 moved permanently授滓。有時候請求的資源無法從其標準地址訪問,但是卻可以從另外的地方訪問肆糕。在這種情況下可以使用臨時重定向般堆。搜索引擎不會記錄該新的、臨時的鏈接诚啃,這種情景服務(wù)器返回的狀態(tài)碼為302 Found淮摔。還有一種特殊的重定向,服務(wù)器返回304 not modified始赎,告訴客戶端資源未被修改和橙,可以使用本地緩存的資源。
重定向機制的實現(xiàn)
重定向的實現(xiàn)有3種方式极阅,
第一種胃碾,即HTTP 協(xié)議中重定向機制是應(yīng)該優(yōu)先采用的創(chuàng)建重定向映射的方式,這需要Web 開發(fā)者對于服務(wù)器有控制權(quán)筋搏,或能對其進行配置仆百。如在apache下重定向映射可以在服務(wù)器的配置文件中設(shè)置。mod_alias 模塊提供了 Redirect 和 Redirect_Match 兩種指令來設(shè)置 302 響應(yīng)(默認值):
<VirtualHost *:80>
ServerName example.com
Redirect / http://www.example.com
</VirtualHost>
URL http://example.com/ 會被重定向至 http://www.example.com/奔脐。
第二種是HTML重定向機制俄周,Web 開發(fā)者可以在精心制作的 HTML 頁面的 <head>? 部分添加一個 <meta> 元素吁讨,并將其 http-equiv 屬性的值設(shè)置為 refresh 。當顯示頁面的時候峦朗,瀏覽器會檢測該元素建丧,然后跳轉(zhuǎn)到指定的頁面。
<head>
? <meta http-equiv="refresh" content="0;URL=http://www.example.com/" />
</head>
content 屬性的值開頭是一個數(shù)字波势,指示瀏覽器在等待該數(shù)字表示的秒數(shù)之后再進行跳轉(zhuǎn)翎朱。建議始終將其設(shè)置為 0 來獲取更好的可訪問性。該方法僅適用于 HTML 頁面(或類似的頁面)尺铣,然而并不能應(yīng)用于圖片或者其他類型的內(nèi)容拴曲。
在 JavaScript 中,重定向機制的原理是設(shè)置 window.location 的屬性值凛忿,然后加載新的頁面澈灼。
window.location = "http://www.example.com/";
與 HTML 重定向機制類似,這種方式并不適用于所有類型的資源店溢,并且顯然只有在支持 JavaScript 的客戶端上才能使用叁熔。另外一方面,它也提供了更多的可能性床牧,比如在只有滿足了特定的條件的情況下才可以觸發(fā)重定向機制的場景荣回。
應(yīng)用場景
HTTP重定向可以在服務(wù)器間導(dǎo)引請求,但它有以下幾個缺點:需要原始服務(wù)器進行大量處理來判斷要重定向到哪臺服務(wù)器上去叠赦。有時驹马,發(fā)布重定向所需的處理量幾乎與提供頁面本身所需的處理量一樣;增加了用戶時延除秀,因為訪問頁面時要進行兩次往返糯累;如果重定向服務(wù)器出故障,站點就會癱瘓册踩。
常見的應(yīng)用場景有泳姐,
有些Web站點會將HTTP重定向作為一種簡單的負載均衡形式來使用。處理重定向的服務(wù)器(重定向服務(wù)器)找到可用的負載最小的內(nèi)容服務(wù)器暂吉,并將瀏覽器重定向到那臺服務(wù)器上去胖秒。
域名別稱,理想情況下慕的,一項資源只有一個訪問位置阎肝,也就是只有一個 URL 。但是由于種種原因肮街,需要為資源設(shè)定不同的名稱(即不同的域名风题,例如帶有和不帶有 www 前綴的URL,以及簡短易記的 URL 等)。在這種情況下沛硅,實用的方法是將其重定向到那個實際的(標準的)URL眼刃,而不是復(fù)制資源。
在以下幾種情況下可以使用域名別稱:
擴大站點的用戶覆蓋面摇肌。一個常見的場景是擂红,假如站點位于? www.example.com? 域名下,那么通過? example.com 也應(yīng)該可以訪問到围小。這種情況下昵骤,可以建立從 example.com 的頁面到? www.example.com 的重定向映射。此外還可以提供常見的同義詞吩抓,或者該域名容易導(dǎo)致的拼寫錯誤的域名別稱涉茧。
遷移到另外一個域名。例如疹娶,公司改名后,你希望用戶在搜索舊名稱的時候伦连,依然可以訪問到應(yīng)用了新名稱的站點雨饺。
強制使用 HTTPS 協(xié)議。對于 HTTP 版本站點的請求會被重定向至采用了 HTTPS 協(xié)議的版本惑淳。如
保持鏈接有效额港,當你重構(gòu) Web 站點的時候,資源的 URL 會發(fā)生改變歧焦。即便是你可以更新站點內(nèi)部的鏈接來適應(yīng)新的命名體系移斩,但無法控制被外部資源使用的 URL 。你并不想因此而使舊鏈接失效绢馍,因為它們會為你帶來寶貴的用戶(并且?guī)椭鷥?yōu)化你的SEO)向瓷,所以需要建立從舊鏈接到新鏈接的重定向映射。
不安全請求的臨時響應(yīng)舰涌,不安全(Unsafe)請求會修改服務(wù)器端的狀態(tài)猖任,應(yīng)該避免用戶無意的重復(fù)操作。一般地瓷耙,你并不想要你的用戶重復(fù)發(fā)送 ?PUT朱躺、POST?或?DELETE?請求。假如你僅僅為該類請求返回響應(yīng)的話搁痛,簡單地點擊刷新按鈕就會(可能會有一個確認信息)導(dǎo)致請求的重復(fù)發(fā)送长搀。在這種情況下,服務(wù)器可以返回一個?303?(See Other) 響應(yīng)鸡典,其中含有合適的響應(yīng)信息源请,或處理成功后?redirect?到另一個?jsp/php頁面。即如果刷新按鈕被點擊的話,只會導(dǎo)致該頁面被刷新巢钓,而不會重復(fù)提交不安全的請求病苗。