?
This document uses PHP Chinese website manual Release
URL重定向或URL轉(zhuǎn)發(fā)是一種保持鏈接處于活動(dòng)狀態(tài)的技術(shù),而實(shí)際資源(作為頁(yè)面,表單或整個(gè)Web應(yīng)用程序)位于不同的URL上。HTTP提供了一種特殊類型的響應(yīng)(HTTP重定向),用于執(zhí)行用于多種目的的此操作:正在進(jìn)行站點(diǎn)維護(hù)時(shí)的臨時(shí)重定向,在站點(diǎn)體系結(jié)構(gòu)更改后保持外部鏈接正常工作的永久重定向,上載文件時(shí)的進(jìn)度頁(yè),還有很多 …
在HTTP中,服務(wù)器通過(guò)向請(qǐng)求發(fā)送特殊響應(yīng)來(lái)重定向:重定向。HTTP重定向是狀態(tài)碼為的響應(yīng)3xx
。瀏覽器在收到重定向響應(yīng)時(shí),會(huì)使用提供的新網(wǎng)址并立即加載該網(wǎng)址:大多數(shù)情況下,重定向?qū)τ脩魜?lái)說(shuō)都是透明的,除此之外性能下降很小。
有幾種類型的重定向,它們分為三類:永久性,臨時(shí)性和特殊重定向。
這些重定向意味著永遠(yuǎn)持續(xù)下去。他們暗示原來(lái)的網(wǎng)址不應(yīng)該再使用,并且新的網(wǎng)址是首選。搜索引擎機(jī)器人會(huì)觸發(fā)其索引中相關(guān)資源的URL更新。
Code | Text | Method handling | Typical use case |
---|---|---|---|
301 | Moved Permanently | GET methods unchanged. Others may or may not be changed to GET.1 | Reorganization of a Web site. |
308 | Permanent Redirect | Method and body not changed. | Reorganization of a Web site, with non-GET links/operations. |
1規(guī)范沒(méi)有意圖允許更改方法,但實(shí)際上有用戶代理在這里執(zhí)行此操作。308
已被創(chuàng)建以消除使用非GET
方法時(shí)行為的不明確性。
有時(shí),所請(qǐng)求的資源無(wú)法從其規(guī)范位置訪問(wèn),但可以從其他位置訪問(wèn)。在這種情況下,可以使用臨時(shí)重定向。搜索引擎機(jī)器人不會(huì)記住新的臨時(shí)鏈接。在創(chuàng)建,更新和刪除資源以呈現(xiàn)臨時(shí)進(jìn)度頁(yè)面時(shí),也會(huì)使用臨時(shí)重定向。
碼 | 文本 | 方法處理 | 典型的用例 |
---|---|---|---|
302 | 發(fā)現(xiàn) | GET方法不變。其他可能會(huì)或可能不會(huì)更改為GET.2 | 該網(wǎng)頁(yè)暫時(shí)無(wú)法使用,原因尚未預(yù)見(jiàn)。這樣,搜索引擎不會(huì)更新他們的鏈接。 |
303 | 見(jiàn)其他 | GET方法不變。其他人更改為GET(身體丟失)。 | 用于在PUT或POST之后重定向,以防止重新觸發(fā)操作的頁(yè)面刷新。 |
307 | 臨時(shí)重定向 | 方法和主體沒(méi)有改變 | 該網(wǎng)頁(yè)暫時(shí)無(wú)法使用,原因尚未預(yù)見(jiàn)。這樣,搜索引擎不會(huì)更新他們的鏈接。當(dāng)網(wǎng)站上的非GET鏈接/操作可用時(shí),優(yōu)于302。 |
2規(guī)范沒(méi)有意圖允許方法改變,但實(shí)際上有用戶代理在那里做這個(gè)。307
已被創(chuàng)建以消除使用非GET
方法時(shí)行為的不明確性。
除了這些通常的重定向之外,還有兩個(gè)特定的重定向。的304
(沒(méi)有改變)一個(gè)頁(yè)面到本地緩存的副本(這是陳舊的)重定向,以及300
(可多選)是手動(dòng)重定向:身體,由瀏覽器作為網(wǎng)頁(yè)呈現(xiàn),列出了可能的重定向和用戶點(diǎn)擊一個(gè)選擇它。
碼 | 文本 | 典型的用例 |
---|---|---|
300 | 多項(xiàng)選擇 | 并不多:這些選擇被列在正文的HTML頁(yè)面中。可以提供200 OK狀態(tài)。 |
304 | 未修改 | 緩存刷新:這表示緩存值仍然是新鮮的可以使用。 |
HTTP重定向不是定義重定向的唯一方法。還有其他兩種方法:使用<meta>
元素的HTML重定向,以及使用DOM的 JavaScript重定向。
HTTP重定向是創(chuàng)建重定向的首選方式,但有時(shí)Web開(kāi)發(fā)人員無(wú)法控制服務(wù)器或無(wú)法對(duì)其進(jìn)行配置。對(duì)于這些特殊情況下,Web開(kāi)發(fā)人員可以用一門(mén)手藝的HTML頁(yè)面<meta>
元素和http-equiv
設(shè)置屬性refresh
的<head>
頁(yè)面。當(dāng)顯示頁(yè)面時(shí),瀏覽器會(huì)找到這個(gè)元素并且會(huì)轉(zhuǎn)到指定的頁(yè)面。
<head> <meta http-equiv="refresh" content="0; URL=http://www.example.com/" /></head>
該content
屬性以一個(gè)數(shù)字開(kāi)頭,表示瀏覽器在重定向到給定URL之前等待多少秒。始終將其設(shè)置0
為更好的可訪問(wèn)性。
顯然,這種方法只適用于HTML頁(yè)面(或類似的),不能用于圖像或任何其他類型的內(nèi)容。
請(qǐng)注意,這些重定向會(huì)破壞瀏覽器中的后退按鈕:您可以返回到帶有此標(biāo)題的頁(yè)面,但它會(huì)立即再次向前移動(dòng)。
JavaScript中的重定向是通過(guò)為window.location
屬性設(shè)置一個(gè)值并加載新頁(yè)面來(lái)創(chuàng)建的。
window.location = "http://www.example.com/";
與HTML重定向一樣,這不能適用于所有資源,顯然這只會(huì)在執(zhí)行JavaScript的客戶端上起作用。另一方面,有更多的可能性,例如,只有滿足一些條件時(shí)才能觸發(fā)重定向。
對(duì)于URL重定向有三種可能性,可以同時(shí)指定幾種方法,但首先應(yīng)用哪一種??jī)?yōu)先順序如下:
當(dāng)甚至沒(méi)有傳輸頁(yè)面時(shí),HTTP重定向總是首先執(zhí)行,當(dāng)然甚至沒(méi)有讀取。
<meta>
如果沒(méi)有任何HTTP重定向,則執(zhí)行HTML重定向()。
只有在客戶端啟用JavaScript的情況下,JavaScript重定向才是最后的手段。
如果可能,請(qǐng)始終嘗試使用HTTP重定向,并且不要使用<meta>
元素。如果開(kāi)發(fā)人員更改HTTP重定向并忘記HTML重定向,則重定向不再相同,或者以無(wú)限循環(huán)結(jié)束,或發(fā)生其他噩夢(mèng)。
有很多用于重定向的用例,但由于每次重定向都會(huì)影響性能,所以它們的使用應(yīng)該保持在最低限度。
理想情況下,一個(gè)資源有一個(gè)位置,因此有一個(gè)URL。但是有理由希望有一個(gè)資源的替代名稱(幾個(gè)域名,比如有或沒(méi)有www前綴,或者更短和易記的URL,...)。在這些情況下,不要復(fù)制資源,而是使用重定向到一個(gè)真正的(規(guī)范)URL是有用的。
出于以下幾個(gè)原因可以完成域別名化:
擴(kuò)大您網(wǎng)站的覆蓋面。一個(gè)常見(jiàn)的情況是,當(dāng)您的網(wǎng)站位于www.example.com
域名下時(shí),您也example.com
應(yīng)該可以訪問(wèn)您的網(wǎng)頁(yè)。在這種情況下設(shè)置example.com
頁(yè)面的重定向www.example.com
。您也可能會(huì)提供常用的同義詞名稱,或經(jīng)常輸入您的域名的拼寫(xiě)錯(cuò)誤。
轉(zhuǎn)移到其他域。例如,您的公司已被重新命名,當(dāng)您搜索舊名稱時(shí),您希望習(xí)慣了舊公司網(wǎng)站的用戶仍能以新名稱找到您。
強(qiáng)制HTTPS。對(duì)您網(wǎng)站的HTTP版本的請(qǐng)求將被重定向到您網(wǎng)站的HTTPS版本。
當(dāng)您重新組織網(wǎng)站時(shí),資源的URL會(huì)發(fā)生變化。即使您可以更新網(wǎng)站的內(nèi)部鏈接以匹配新的命名方案,也無(wú)法控制外部資源使用的URL。你不想破壞這些鏈接,因?yàn)樗鼈優(yōu)槟銕?lái)有價(jià)值的用戶(并幫助你的搜索引擎優(yōu)化),所以你設(shè)置了從舊網(wǎng)址到新網(wǎng)址的重定向。
即使這種技術(shù)也適用于內(nèi)部鏈接,您應(yīng)該盡量避免內(nèi)部重定向。重定向具有顯著的性能成本(因?yàn)轭~外的HTTP請(qǐng)求已完成),如果可以通過(guò)更正內(nèi)部鏈接來(lái)避免它,則應(yīng)修復(fù)這些鏈接。
不安全的請(qǐng)求修改服務(wù)器的狀態(tài),用戶不應(yīng)無(wú)意中重播它們。通常情況下,你不希望你的用戶重新發(fā)送PUT
,POST
或DELETE
請(qǐng)求。如果您只是作為此請(qǐng)求的結(jié)果提供響應(yīng),則只需簡(jiǎn)單按下重新加載按鈕(可能在確認(rèn)消息之后),重新發(fā)送請(qǐng)求。
在這種情況下,服務(wù)器可以發(fā)回303
包含正確信息的(請(qǐng)參閱其他)響應(yīng),但如果按下重新加載按鈕,則只會(huì)重新顯示此頁(yè)面,而不會(huì)重播不安全的請(qǐng)求。
某些請(qǐng)求可能需要更多時(shí)間在服務(wù)器上,例如有時(shí)DELETE
請(qǐng)求被安排用于稍后處理。在這種情況下,響應(yīng)是一個(gè)303
(請(qǐng)參見(jiàn)其他)重定向,該重定向鏈接到指示該操作已安排的頁(yè)面,并最終通知有關(guān)進(jìn)度或允許取消該進(jìn)度。
重定向可以在服務(wù)器配置文件中或.htaccess
每個(gè)目錄中設(shè)置。
所述mod_alias中模塊具有Redirect
與Redirect_Match
該設(shè)置了指令302
(默認(rèn))的反應(yīng):
<VirtualHost *:80> ServerName example.com Redirect / http://www.example.com</VirtualHost>
該URL http://example.com/
將被重定向到http://www.example.com/
(但不是http://example.com/other.html
)
Redirect_Match
做同樣的事情,但需要一個(gè)正則表達(dá)式來(lái)定義受影響的URL集合:
RedirectMatch ^/images/(.*)$ http://images.example.com/$1
該images/
文件夾中的所有文檔都將重定向到不同的域。
如果您不想設(shè)置臨時(shí)重定向,則可以使用額外參數(shù)(要使用的HTTP狀態(tài)碼或permanent
關(guān)鍵字)來(lái)設(shè)置不同的重定向:
Redirect permanent / http://www.example.com Redirect 301 / http://www.example.com
該mod_rewrite的模塊也可以用來(lái)創(chuàng)建重定向。它更靈活,但使用起來(lái)更復(fù)雜一些。
在Nginx中,您為要重定向的內(nèi)容創(chuàng)建特定的服務(wù)器塊:
server { listen 80; server_name example.com;return 301 $scheme://www.example.com$request_uri;}
要僅將重定向應(yīng)用于文件夾或頁(yè)面的子集,請(qǐng)使用以下rewrite
指令:
rewrite ^/images/(.*)$ http://images.example.com/$1 redirect;rewrite ^/images/(.*)$ http://images.example.com/$1 permanent;
在IIS中,您使用該<httpRedirect>
元素來(lái)配置重定向。
當(dāng)連續(xù)的重定向遵循已經(jīng)遵循的重定向時(shí),重定向循環(huán)發(fā)生。換句話說(shuō),有一個(gè)永遠(yuǎn)不會(huì)完成的循環(huán),最終不會(huì)找到任何頁(yè)面。
大多數(shù)情況下,這是一個(gè)服務(wù)器問(wèn)題,如果服務(wù)器無(wú)法檢測(cè)到,它會(huì)發(fā)回一個(gè)500
Internal Server Error
。如果在修改服務(wù)器配置后很快遇到這樣的錯(cuò)誤,這可能是重定向循環(huán)。
有時(shí)候,服務(wù)器不會(huì)檢測(cè)到它:重定向循環(huán)可以分布在幾臺(tái)服務(wù)器上,每臺(tái)服務(wù)器都沒(méi)有完整的圖像。在這種情況下,瀏覽器會(huì)檢測(cè)到它并發(fā)布錯(cuò)誤消息。Firefox將顯示:
Firefox has detected that the server is redirecting the request for this address in a way that will never complete.
而Chrome會(huì)顯示:
This Webpage has a redirect loop
在這兩種情況下,用戶都無(wú)法做很多事情(除非他們身上發(fā)生了腐敗現(xiàn)象,例如緩存或Cookie不匹配)。
避免重定向循環(huán)很重要,因?yàn)樗鼈兺耆茐牧擞脩趔w驗(yàn)。
在MDN上編輯此頁(yè)面