1. 程式人生 > >HTTP狀態碼中301與302的區別

HTTP狀態碼中301與302的區別

一.官方說法
301,302 都是HTTP狀態的編碼,都代表著某個URL發生了轉移,不同之處在於:
301 redirect: 301 代表永久性轉移(Permanently Moved)。
302 redirect: 302 代表暫時性轉移(Temporarily Moved )。
這是很官方的說法,那麼它們的區別到底是什麼呢?
1.1、什麼是301轉向?什麼是301重定向?
  301轉向(或叫301重定向,301跳轉)是當用戶或搜尋引擎向網站伺服器發出瀏覽請求時,伺服器返回的HTTP資料流中頭資訊(header)中的狀態碼的一種,表示本網頁永久性轉移到另一個地址。
1.2、什麼是302重定向?
  302重定向又稱之為302代表暫時性轉移(Temporarily Moved ),英文名稱:302 redirect。 也被認為是暫時重定向(temporary redirect),一條對網站瀏覽器的指令來顯示瀏覽器被要求顯示的不同的URL,當一個網頁經歷過短期的URL的變化時使用。一個暫時重定向是一種服 務器端的重定向,能夠被搜尋引擎蜘蛛正確地處理。
1.3、301重定向與302重定向的區別
  302重定向是暫時的重定向,搜尋引擎會抓取新的內容而保留舊的網址。因為伺服器返回302程式碼,搜尋引擎認為新的網址只是暫時的。 SEO 302好於301
  301重定向是永久的重定向,搜尋引擎在抓取新內容的同時也將舊的網址替換為重定向之後的網址。
二.現實中的差異
2.1.對於使用者
301,302對使用者來說沒有區別,他們看到效果只是一個跳轉,瀏覽器中舊的URL變成了新的URL。頁面跳到了這個新的url指向的地方。
2.2.對於引擎及站長
2.2.1 302
302轉向可能會有URL規範化及網址劫持的問題。可能被搜尋引擎判為可疑轉向,甚至認為是作弊。
網址規範化
請參見:

http://www.chinamyhosting.com/seoblog/2006/04/10/url-canonicalization/
網址劫持
302重定向和網址劫持(URL hijacking)有什麼關係呢?這要從搜尋引擎如何處理302轉向說起。從定義來說,從網址A做一個302重定向到網址B時,主機伺服器的隱含意思是網址A隨時有可能改主意,重新顯示本身的內容或轉向其他的地方。大部分的搜尋引擎在大部分情況下,當收到302重定向時,一般只要去抓取目標網址就可以了,也就是說網址B。
實際上如果搜尋引擎在遇到302轉向時,百分之百的都抓取目標網址B的話,就不用擔心網址URL劫持了。問題就在於,有的時候搜尋引擎,尤其是Google,並不能總是抓取目標網址。為什麼呢?比如說,有的時候A網址很短,但是它做了一個302重定向到B網址,而B網址是一個很長的亂七八糟的URL網址,甚至還有可能包含一些問號之類的引數。很自然的,A網址更加使用者友好,而B網址既難看,又不使用者友好。這時Google很有可能會仍然顯示網址A。
由於搜尋引擎排名演算法只是程式而不是人,在遇到302重定向的時候,並不能像人一樣的去準確判定哪一個網址更適當,這就造成了網址URL劫持的可能性。也就是說,一個不道德的人在他自己的網址A做一個302重定向到你的網址B,出於某種原因, Google搜尋結果所顯示的仍然是網址A,但是所用的網頁內容卻是你的網址B上的內容,這種情況就叫做網址URL劫持。你辛辛苦苦所寫的內容就這樣被別人偷走了。
2.2.2 301
當網頁A用301重定向轉到網頁B時,搜尋引擎可以肯定網頁A永久的改變位置,或者說實際上不存在了,搜尋引擎就會把網頁B當作唯一有效目標。
301的好處是:
第一, 沒有網址規範化問題。
第二, 也很重要的,網頁A的PR網頁級別會傳到網頁B。
三.Apache中實現301、302
方法一,url rewrite,mod_rewrite

Rewriteengine on
RewriteCond %{HTTP_HOST} ^cmp.soso.com [NC]
RewriteRule ^/js/(.*) http://www.soso.com/js/$1  [R=301]
ServerName cmp.soso.com

將cmp.soso.com中js目錄的下所有訪問重定向到http://www.soso.com/js/,指定跳轉返回碼為301。
對於[R=301]的詳解:
‘redirect|R [=code]’ (強制重定向 redirect)
http://thishost[:thisport]/(使新的URL成為一個URI) 為字首的Substitution可以強制性執行一個外部重定向。 如果code沒有指定,則產生一個HTTP響應程式碼302(臨時性移動)。 如果需要使用在300-400範圍內的其他響應程式碼,只需在此指定這個數值即可, 另外,還可以使用下列符號名稱之一: temp (預設的), permanent, seeother. 用它可以把規範化的URL反饋給客戶端,如, 重寫/~''為

/u/”,或對/u/user加上斜槓,等等。
注意: 在使用這個標記時,必須確保該替換欄位是一個有效的URL! 否則,它會指向一個無效的位置! 並且要記住,此標記本身只是對URL加上 http://thishost[:thisport]/的字首,重寫操作仍然會繼續。 通常,你會希望停止重寫操作而立即重定向,則還需要使用’L’標記.
方法二 Redirect ,涉及模組:mod_alias
例:

<VirtualHost 10.1.146.163:80>
   DocumentRoot /home/qmhball/web/mybranches/stat_3276/oa/
   ServerName oalogin.com
   Redirect 301 /login.php http://www.soso.com
</VirtualHost>

將oalogin.com下對login.php的訪問重定向到http://www.soso.com,返回碼301。
如果沒有指定redirect的返回引數(例中的301),則預設重定向是”臨時性的”(HTTP status 302)。

這裡寫圖片描述