404 Not Found
301 Moved Permanently
302 Found
500 Internal Server Error
HTTP重定向就是通過301和302兩種狀態碼來實現的。
302是臨時重定向。表示被訪問頁面因為各種需要被臨時跳轉到其他頁面。 瀏覽器在收到302 Found的狀態碼之后會在返回的HTTP Response Header中查找Location字段,然后訪問對應地址。
301是永久重定向。同樣,瀏覽器在發現301的狀態碼之后會查找Location字段,然后訪問那個地址。Location字段的格式很隨意,既可以是絕對地址,也可以是相對地址,還可以是相對根目錄的地址。
301重定向和302重定向在SEO以及緩存上是有非常大區別的。對於SEO也就是搜索引擎優化,一個頁面302重定向到另一個頁面,新頁面的PageRank不會受原頁面影響。而一個頁面301重定向到另一個頁面,原頁面的PageRank會被傳遞到新頁面。所以對於一個網站進行域名轉換,最好的方法就是使用301重定向,在經過一段時間之后可以不損失PR地將全站轉移到新域名下。
對於HTTP代理服務器例如squid來說,如果一個頁面是302重定向到新頁面並且沒有指定Expire HTTP頭,squid將不緩存這個信息,也就是說每次用戶通過代理請求時都會重新獲取一遍。而對於301重定向,squid可以將結果緩存以便快速響應下一個請求相同頁面的用戶。
PHP里的302重定向非常簡單,只要在返回的HTTP Response Header里添加Location字段,PHP將自動返回302狀態碼。而301重定向則稍微有點復雜,需要直接將301狀態碼用header函數返回給用戶。
而301重定向則稍微有點復雜,需要直接將301狀態碼用header函數返回給用戶。例如:
< ?php
header( "HTTP/1.1 301 Moved Permanently" );
header( "Location: http://yegle.net/" );
?>
注意的是,跳轉不是在收到response header的時候馬上進行,也就是說頁面的剩余內容會被下載來之后瀏覽器才會跳轉。新手常犯的一個錯誤是,在邏輯判斷時對符合條件的情況進行header跳轉之后,忘了在之后加上exit(),導致錯誤。例如,用user_login()判斷用戶是否進行了登錄,如果未登錄則跳轉到登錄頁面。代碼如下:
if(!user_login()){
header("Location:login.php");
}
//display contents for login users.
這里,容易以為header之后這段代碼就結束了,沒有在header之后使用exit()。后面的代碼繼續被執行,導致未登錄用戶看到了已登錄用戶才能看到的內容。
