http狀態碼301和302詳解及區別——辛酸的探索之路
一直對http狀態碼301和302的理解比較模糊,在遇到實際的問題和翻閱各種資料瞭解後,算是有了一定的理解。這裡記錄下,希望能有新的認識。大家也共勉。
官方的比較簡潔的說明:
301 redirect: 301 代表永久性轉移(Permanently Moved)
302 redirect: 302 代表暫時性轉移(Temporarily Moved )
ps:這裡也順帶記住了兩個比較相近的英語單詞(permanently、temporarily),嘻哈!
詳細來說,301和302狀態碼都表示重定向,就是說瀏覽器在拿到伺服器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址可以從響應的Location首部中獲取(使用者看到的效果就是他輸入的地址A瞬間變成了另一個地址B)——這是它們的共同點。他們的不同在於。301表示舊地址A的資源已經被永久地移除了(這個資源不可訪問了),搜尋引擎在抓取新內容的同時也將舊的網址交換為重定向之後的網址;302表示舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜尋引擎會抓取新的內容而儲存舊的網址。
這裡開啟傻瓜自問自答模式(自己可能想到的疑問):
1、什麼是重定向啊?
就是地址A跳轉到地址B啦。百度百科的解釋:重定向(Redirect)就是通過各種方法將各種網路請求重新定個方向轉到其它位置(如:網頁重定向、域名的重定向、路由選擇的變化也是對資料報文經由路徑的一種重定向)。
2、可是,為什麼要進行重定向啊?什麼時候需要重定向呢?
想跳就跳,就跳的漂亮。還是借鑑百度百科:
1)網站調整(如改變網頁目錄結構);
2)網頁被移到一個新地址;
3)網頁副檔名改變(如應用需要把.php改成.Html或.shtml)。
這種情況下,如果不做重定向,則使用者收藏夾或搜尋引擎資料庫中舊地址只能讓訪問客戶得到一個404頁面錯誤資訊,訪問流量白白喪失;再者某些註冊了多個域名的網站,也需要通過重定向讓訪問這些域名的使用者自動跳轉到主站點等。
3、那麼,什麼時候進行301或者302跳轉呢?
當一個網站或者網頁24—48小時內臨時移動到一個新的位置,這時候就要進行302跳轉,打個比方說,我有一套房子,但是最近走親戚去親戚家住了,過兩天我還回來的。而使用301跳轉的場景就是之前的網站因為某種原因需要移除掉,然後要到新的地址訪問,是永久性的,就比如你的那套房子其實是租的,現在租期到了,你又在另一個地方找到了房子,之前租的房子不住了。
清晰明確而言:
使用301跳轉的場景:
1)域名到期不想續費(或者發現了更適合網站的域名),想換個域名。
2)在搜尋引擎的搜尋結果中出現了不帶www的域名,而帶www的域名卻沒有收錄,這個時候可以用301重定向來告訴搜尋引擎我們目標的域名是哪一個。
3)空間伺服器不穩定,換空間的時候。
使用302跳轉的場景:
--儘量使用301跳轉!
4、為什麼儘量要使用301跳轉?——網址劫持!
這裡摘錄百度百科上的解釋:
從網址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 劫持。你辛辛苦苦所寫的內容就這樣被別人偷走了。302 重定向所造成的網址URL 劫持現象,已經存在一段時間了。不過到目前為止,似乎也沒有什麼更好的解決方法。在正在進行的谷歌大爸爸資料中心轉換中,302 重定向問題也是要被解決的目標之一。從一些搜尋結果來看,網址劫持現象有所改善,但是並沒有完全解決。
我的理解是,從網站A(網站比較爛)上做了一個302跳轉到網站B(搜尋排名很靠前),這時候有時搜尋引擎會使用網站B的內容,但卻收錄了網站A的地址,這樣在不知不覺間,網站B在為網站A作貢獻,網站A的排名就靠前了。
301跳轉對查詢引擎是一種對照馴良的跳轉編制,也是查詢引擎能夠遭遇的跳轉編制,它告訴查詢引擎,這個地址棄用了,永遠轉向一個新地址,可以轉移新域名的權重。而302重定向很容易被搜尋引擎誤認為是利用多個域名指向同一網站,那麼你的網站就會被封掉,罪名是“利用重複的內容來干擾Google搜尋結果的網站排名”。
自問自答模式先告一段落,這裡分享下我在NodeJs中實現跳轉的場景:
之前做過一個重構的專案,由於各種原因,我們的網站的登入以及註冊部分需要剝離為另一個網站,域名和之前的不同,所以,我們需要保證舊的地址也能重定向到地址中去,我們就在舊的系統的node層中作了一個重定向,程式碼類似這樣:
這裡沒有設定狀態碼,發現預設是302跳轉,然後我們設定了301狀態碼,類似這樣:
用fiddle抓包(上面的302調整我就不上圖了),看到效果:
以上是使用Express,用nodejs原生的程式碼實現類似這樣: