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