轉載:https://blog.csdn.net/kiyoometal/article/details/90698761
重定向原理
HTTP 協議的重定向響應的狀態碼為 3xx 。瀏覽器在接收到重定向響應的時候,會采用該響應提供的新的 URL ,並立即進行加載;
大多數情況下,除了會有一小部分性能損失之外,重定向操作對於用戶來說是不可見的。
不同類型的重定向映射可以划分為三個類別:永久重定向、臨時重定向和特殊重定向。
重定向的目的
1、相似域名
瀏覽者可能輸入錯誤的域名,如:gooogle.com或googel.com。機構或團體不時會注冊這些拼字不正確的網域名,重定向到正確地方:google.com。例如:example.com和example.net兩者均會重定向至像是example.org的單一網域或網頁。
2、移動網站至新網域
- 網站需要改變它的域名。
- 作者移動他/她的網頁至新域名。
- 2個網站結合。
3、重定向方式
1、設定重定向映射
- 300=Multiple Choices
- 301=Moved Permanently
- 302=Found
- 303=See Other
- 304=Not Modified
- 305=Use Proxy
- 306=(Unused)
- 307=Temporary Redirect
其中以301、302、307最為常見,301代表永久轉址,對於搜索引擎判定頁面改變有直接影響,302代表暫時轉址,通常用於頁面暫時修改,之后會在恢復網址時使用。在搜索引擎優化上,將錯誤的302轉址改成301轉址對網站排名有相當作用。
2、借助 HTML 的 meta 元素的 HTML 重定向機制
例子:
<head> <meta http-equiv="refresh" content="0;URL=http://www.example.com/" /> </head>
content
屬性的值開頭是一個數字
,指示瀏覽器在等待該數字表示的秒數之后再進行跳轉。建議始終將其設置為 0 來獲取更好的可訪問性
。
顯然,該方法僅適用於 HTML 頁面(或類似的頁面),然而並不能應用於圖片或者其他類型的內容。
注意這種機制會使瀏覽器的回退按鈕失效:可以返回含有這個頭部的頁面,但是又會立即跳轉。
3、借助 DOM 的 JavaScript 重定向機制
window.location = "http://www.example.com/";
與 HTML 重定向機制類似,這種方式並不適用於所有類型的資源,並且顯然只有在支持 JavaScript
的客戶端上才能使用。另外一方面,它也提供了更多的可能性,比如在只有滿足了特定的條件的情況下才可以觸發重定向機制的場景。
三種重定向方法的優先級
由於存在上述三種 URL 重定向機制,那么在多種方法同時設定的情況下,哪種方法會首先起作用呢?優先級順序如下:
1、HTTP 協議的重定向機制永遠最先觸發,即便是在沒有傳送任何頁面——也就沒有頁面被(客戶端)讀取——的情況下。
2、HTML 的重定向機制 () 會在 HTTP 協議重定向機制未設置的情況下觸發。
3、JavaScript 的重定向機制總是作為最后訴諸的手段,並且只有在客戶端開啟了 JavaScript 的情況下才起作用。
任何情況下,只要有可能,就應該采用 HTTP 協議的重定向機制,而不要使用 meta 標簽。假如開發人員修改了 HTTP 重定向映射而忘記修改 HTML 頁面的重定向映射,那么二者就會不一致,最終結果或者出現無限循環,或者導致其他噩夢的發生。
重定向的應用場景
有以下幾種應用場景可以使用重定向機制,但是需要注意應該盡可能地限制其使用數量,因為每一次重定向都會帶來性能上的開銷。
在以下幾種情況下可以使用域名別稱:
1、擴大站點的用戶覆蓋面。一個常見的場景是,假如站點位於 www.example.com 域名下,那么通過 example.com 也應該可以訪問到。這種情況下,可以建立從 example.com 的頁面到 www.example.com 的重定向映射。此外還可以提供常見的同義詞,或者該域名容易導致的拼寫錯誤的域名別稱。
2、遷移到另外一個域名。例如,公司改名后,你希望用戶在搜索舊名稱的時候,依然可以訪問到應用了新名稱的站點。
3、強制使用 HTTPS 協議。對於 HTTP 版本站點的請求會被重定向至采用了 HTTPS 協議的版本。
4、對於耗時請求的臨時響應:一些請求的處理會需要比較長的時間,比如有時候 DELETE 請求會被安排為稍后處理。在這種情況下,會返回一個 303 (See Other) 重定向響應,該響應鏈接到一個頁面,表示請求的操作已經被列入計划,並且最終會通知用戶操作的進展情況,或者允許用戶將其取消。
5、對於不安全請求的臨時請求:不安全(Unsafe)請求會修改服務器端的狀態,應該避免用戶無意的重復操作。一般地,你並不想要你的用戶重復發送 PUT、POST 或 DELETE 請求。假如你僅僅為該類請求返回響應的話,簡單地點擊刷新按鈕就會(可能會有一個確認信息)導致請求的重復發送。
在這種情況下,服務器可以返回一個 303 (See Other) 響應,其中含有合適的響應信息。如果刷新按鈕被點擊的話,只會導致該頁面被刷新,而不會重復提交不安全的請求。
在通用服務器中配置重定向
apache
重定向映射可以在服務器的配置文件中設置,也可以在每一個文件目錄的 .htaccess 文件中設置。
mod_alias 模塊提供了 Redirect 和 Redirect_Match 兩種指令來設置 302 響應(默認值):
<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/ 文件夾下的所有文檔都會被重定向至新的域名。
如果你不想要設置臨時跳轉,那么可是使用額外的參數(使用 HTTP 狀態碼或者 permanent 關鍵字)來進行設置:
Redirect permanent / http://www.example.com Redirect 301 / http://www.example.com
mod_rewrite 模塊也可以用來設置重定向映射。它應用起來更靈活,但也更加復雜。
nginx
在 Nginx 中,你可以創建一個服務器模塊來進行重定向設置:
server { listen 80; server_name example.com; return 301 $scheme://www.example.com$request_uri; }
可以使用 rewrite 指令來針對一個文件目錄或者一部分頁面應用重定向設置:
rewrite ^/images/(.*)$ http://images.example.com/$1 redirect; rewrite ^/images/(.*)$ http://images.example.com/$1 permanent;
IIS
在 IIS 中,你可以使用 元素來配置重定向映射
重定向循環
當后續的重定向路徑重復之前的路徑的時候,重定向循環就產生了。換句話說,就是陷入了無限循環當中,不會有一個最終的頁面返回。
大多數情況下,這屬於服務器端錯誤。如果服務器檢測不到,就會返回 500 Internal Server Error 。假如你在修改了服務器配置不久就出現了這個問題,八成是遇到了重定向循環。
有時候,服務器端無法對其進行檢測:重定向循環發生於多台服務器之間,對於每一台服務器來說,都無法獲得一個全景圖。在這種情況下,瀏覽器會負責進行檢測,然后返回錯誤信息。