HTTP 協議的重定向響應的狀態碼爲 3xx 。瀏覽器在接收到重定向響應的時候,會採用該響應提供的新的 URL ,並當即進行加載;大多數狀況下,除了會有一小部分性能損失以外,重定向操做對於用戶來講是不可見的。
不一樣類型的重定向映射能夠劃分爲三個類別:永久重定向
、臨時重定向
和特殊重定向
。html
瀏覽者可能輸入錯誤的域名,如:gooogle.com或googel.com。機構或團體不時會註冊這些拼字不正確的網域名,重定向到正確地方:google.com。例如:example.com和example.net二者均會重定向至像是example.org的單一網域或網頁。nginx
其中以30一、30二、307最爲常見,301表明永久轉址,對於搜索引擎斷定頁面改變有直接影響,302表明暫時轉址,一般用於頁面暫時修改,以後會在恢復網址時使用。在搜索引擎優化上,將錯誤的302轉址改爲301轉址對網站排名有至關做用。正則表達式
栗子:apache
<head> <meta http-equiv="refresh" content="0;URL=http://www.example.com/" /> </head>
content
屬性的值開頭是一個數字
,指示瀏覽器在等待該數字表示的秒數以後再進行跳轉。建議始終將其設置爲 0 來獲取更好的可訪問性
。瀏覽器
顯然,該方法僅適用於 HTML 頁面(或相似的頁面),然而並不能應用於圖片或者其餘類型的內容。安全
注意這種機制會使瀏覽器的
回退按鈕失效
:能夠返回含有這個頭部的頁面,可是又會當即跳轉。服務器
window.location = "http://www.example.com/";
與 HTML 重定向機制相似,這種方式並不適用於全部類型的資源,而且顯然只有在支持 JavaScript
的客戶端上才能使用。另一方面,它也提供了更多的可能性,好比在只有知足了特定的條件的狀況下才能夠觸發重定向機制的場景。性能
因爲存在上述三種 URL 重定向機制,那麼在多種方法同時設定的狀況下,哪一種方法會首先起做用呢?優先級順序以下:優化
一、HTTP 協議的重定向機制永遠最早觸發,即使是在沒有傳送任何頁面——也就沒有頁面被(客戶端)讀取——的狀況下。網站
二、HTML 的重定向機制 () 會在 HTTP 協議重定向機制未設置的狀況下觸發。
三、JavaScript 的重定向機制老是做爲最後訴諸的手段,而且只有在客戶端開啓了 JavaScript 的狀況下才起做用。
任何狀況下,只要有可能,就應該採用 HTTP 協議的重定向機制,而不要使用 meta 標籤。假如開發人員修改了 HTTP 重定向映射而忘記修改 HTML 頁面的重定向映射,那麼兩者就會不一致,最終結果或者出現無限循環,或者致使其餘噩夢的發生。
有如下幾種應用場景可使用重定向機制,可是須要注意應該儘量地限制其使用數量,由於每一次重定向都會帶來性能上的開銷。
在如下幾種狀況下可使用域名別稱:
一、擴大站點的用戶覆蓋面。一個常見的場景是,假如站點位於 www.example.com 域名下,那麼經過 example.com 也應該能夠訪問到。這種狀況下,能夠創建從 example.com 的頁面到 www.example.com 的重定向映射。此外還能夠提供常見的同義詞,或者該域名容易致使的拼寫錯誤的域名別稱。
二、遷移到另一個域名。例如,公司更名後,你但願用戶在搜索舊名稱的時候,依然能夠訪問到應用了新名稱的站點。
三、強制使用 HTTPS 協議。對於 HTTP 版本站點的請求會被重定向至採用了 HTTPS 協議的版本。
四、對於耗時請求的臨時響應:一些請求的處理會須要比較長的時間,好比有時候 DELETE 請求會被安排爲稍後處理。在這種狀況下,會返回一個 303 (See Other) 重定向響應,該響應連接到一個頁面,表示請求的操做已經被列入計劃,而且最終會通知用戶操做的進展狀況,或者容許用戶將其取消。
五、對於不安全請求的臨時請求:不安全(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 。假如你在修改了服務器配置不久就出現了這個問題,八成是遇到了重定向循環。
有時候,服務器端沒法對其進行檢測:重定向循環發生於多臺服務器之間,對於每一臺服務器來講,都沒法得到一個全景圖。在這種狀況下,瀏覽器會負責進行檢測,而後返回錯誤信息。