http狀態(tài)碼301和302詳解及區(qū)別
一直對http狀態(tài)碼301和302的理解比較模糊咏闪,在遇到實際的問題和翻閱各種資料了解后峦筒,算是有了一定的理解赴涵。這里記錄下窗慎,希望能有新的認識采幌。大家也共勉。
官方的比較簡潔的說明:
? ? ? ? 301 redirect: 301 代表永久性轉(zhuǎn)移(Permanently Moved)
? ? ? ? 302 redirect: 302 代表暫時性轉(zhuǎn)移(Temporarily Moved )
? ? ? ? ps:這里也順帶記住了兩個比較相近的英語單詞(permanently躬络、temporarily),嘻哈搭儒!
詳細來說穷当,301和302狀態(tài)碼都表示重定向,就是說瀏覽器在拿到服務器返回的這個狀態(tài)碼后會自動跳轉(zhuǎn)到一個新的URL地址淹禾,這個地址可以從響應的Location首部中獲饶俨恕(用戶看到的效果就是他輸入的地址A瞬間變成了另一個地址B)——這是它們的共同點。他們的不同在于稀拐。301表示舊地址A的資源已經(jīng)被永久地移除了(這個資源不可訪問了)火邓,搜索引擎在抓取新內(nèi)容的同時也將舊的網(wǎng)址交換為重定向之后的網(wǎng)址;302表示舊地址A的資源還在(仍然可以訪問)德撬,這個重定向只是臨時地從舊地址A跳轉(zhuǎn)到地址B铲咨,搜索引擎會抓取新的內(nèi)容而保存舊的網(wǎng)址。
? ? ? 這里開啟傻瓜自問自答模式(自己可能想到的疑問):
1蜓洪、什么是重定向跋死铡?
就是地址A跳轉(zhuǎn)到地址B啦隆檀。百度百科的解釋:重定向(Redirect)就是通過各種方法將各種網(wǎng)絡請求重新定個方向轉(zhuǎn)到其它位置(如:網(wǎng)頁重定向摇天、域名的重定向、路由選擇的變化也是對數(shù)據(jù)報文經(jīng)由路徑的一種重定向)恐仑。
2泉坐、可是,為什么要進行重定向吧哑汀腕让?什么時候需要重定向呢?
? ? ? ? 想跳就跳歧斟,就跳的漂亮纯丸。還是借鑒百度百科:
1)網(wǎng)站調(diào)整(如改變網(wǎng)頁目錄結(jié)構);
2)網(wǎng)頁被移到一個新地址静袖;
3)網(wǎng)頁擴展名改變(如應用需要把.php改成.Html或.shtml)觉鼻。
? ? ? ? 這種情況下,如果不做重定向队橙,則用戶收藏夾或搜索引擎數(shù)據(jù)庫中舊地址只能讓訪問客戶得到一個404頁面錯誤信息坠陈,訪問流量白白喪失萨惑;再者某些注冊了多個域名的網(wǎng)站,也需要通過重定向讓訪問這些域名的用戶自動跳轉(zhuǎn)到主站點等仇矾。
3咒钟、那么,什么時候進行301或者302跳轉(zhuǎn)呢若未?
? ? ? ? 當一個網(wǎng)站或者網(wǎng)頁24—48小時內(nèi)臨時移動到一個新的位置,這時候就要進行302跳轉(zhuǎn)倾鲫,打個比方說粗合,我有一套房子,但是最近走親戚去親戚家住了乌昔,過兩天我還回來的隙疚。而使用301跳轉(zhuǎn)的場景就是之前的網(wǎng)站因為某種原因需要移除掉,然后要到新的地址訪問磕道,是永久性的供屉,就比如你的那套房子其實是租的,現(xiàn)在租期到了溺蕉,你又在另一個地方找到了房子伶丐,之前租的房子不住了。
? ? 清晰明確而言:
使用301跳轉(zhuǎn)的場景:
1)域名到期不想續(xù)費(或者發(fā)現(xiàn)了更適合網(wǎng)站的域名)疯特,想換個域名哗魂。
2)在搜索引擎的搜索結(jié)果中出現(xiàn)了不帶www的域名,而帶www的域名卻沒有收錄漓雅,這個時候可以用301重定向來告訴搜索引擎我們目標的域名是哪一個录别。
3)空間服務器不穩(wěn)定,換空間的時候邻吞。
使用302跳轉(zhuǎn)的場景:
? ? ? ? --盡量使用301跳轉(zhuǎn)组题!
4、為什么盡量要使用301跳轉(zhuǎn)抱冷?——網(wǎng)址劫持崔列!
? ? ? ? 這里摘錄百度百科上的解釋:
? ? ? ??從網(wǎng)址A 做一個302 重定向到網(wǎng)址B 時,主機服務器的隱含意思是網(wǎng)址A 隨時有可能改主意徘层,重新顯示本身的內(nèi)容或轉(zhuǎn)向其他的地方峻呕。大部分的搜索引擎在大部分情況下,當收到302 重定向時趣效,一般只要去抓取目標網(wǎng)址就可以了瘦癌,也就是說網(wǎng)址B。如果搜索引擎在遇到302 轉(zhuǎn)向時跷敬,百分之百的都抓取目標網(wǎng)址B 的話讯私,就不用擔心網(wǎng)址URL 劫持了。問題就在于,有的時候搜索引擎斤寇,尤其是Google桶癣,并不能總是抓取目標網(wǎng)址。比如說娘锁,有的時候A 網(wǎng)址很短牙寞,但是它做了一個302 重定向到B 網(wǎng)址,而B 網(wǎng)址是一個很長的亂七八糟的URL 網(wǎng)址莫秆,甚至還有可能包含一些問號之類的參數(shù)间雀。很自然的,A 網(wǎng)址更加用戶友好镊屎,而B 網(wǎng)址既難看惹挟,又不用戶友好。這時Google 很有可能會仍然顯示網(wǎng)址A缝驳。由于搜索引擎排名算法只是程序而不是人连锯,在遇到302 重定向的時候,并不能像人一樣的去準確判定哪一個網(wǎng)址更適當用狱,這就造成了網(wǎng)址URL?劫持的可能性运怖。也就是說,一個不道德的人在他自己的網(wǎng)址A 做一個302 重定向到你的網(wǎng)址B齿拂,出于某種原因驳规, Google 搜索結(jié)果所顯示的仍然是網(wǎng)址A,但是所用的網(wǎng)頁內(nèi)容卻是你的網(wǎng)址B 上的內(nèi)容署海,這種情況就叫做網(wǎng)址URL 劫持吗购。你辛辛苦苦所寫的內(nèi)容就這樣被別人偷走了。302 重定向所造成的網(wǎng)址URL 劫持現(xiàn)象砸狞,已經(jīng)存在一段時間了捻勉。不過到目前為止,似乎也沒有什么更好的解決方法刀森。在正在進行的谷歌大爸爸數(shù)據(jù)中心轉(zhuǎn)換中踱启,302 重定向問題也是要被解決的目標之一。從一些搜索結(jié)果來看研底,網(wǎng)址劫持現(xiàn)象有所改善埠偿,但是并沒有完全解決。
? ? ? ? 我的理解是榜晦,從網(wǎng)站A(網(wǎng)站比較爛)上做了一個302跳轉(zhuǎn)到網(wǎng)站B(搜索排名很靠前)冠蒋,這時候有時搜索引擎會使用網(wǎng)站B的內(nèi)容,但卻收錄了網(wǎng)站A的地址乾胶,這樣在不知不覺間抖剿,網(wǎng)站B在為網(wǎng)站A作貢獻朽寞,網(wǎng)站A的排名就靠前了。
301跳轉(zhuǎn)對查找引擎是一種對照馴良的跳轉(zhuǎn)編制斩郎,也是查找引擎能夠遭遇的跳轉(zhuǎn)編制脑融,它告訴查找引擎,這個地址棄用了缩宜,永遠轉(zhuǎn)向一個新地址肘迎,可以轉(zhuǎn)移新域名的權重。而302重定向很容易被搜索引擎誤認為是利用多個域名指向同一網(wǎng)站锻煌,那么你的網(wǎng)站就會被封掉膜宋,罪名是“利用重復的內(nèi)容來干擾Google搜索結(jié)果的網(wǎng)站排名”。
? ? ? ? 自問自答模式先告一段落炼幔,這里分享下我在NodeJs中實現(xiàn)跳轉(zhuǎn)的場景:
? ? ? ? 之前做過一個重構的項目,由于各種原因史简,我們的網(wǎng)站的登錄以及注冊部分需要剝離為另一個網(wǎng)站乃秀,域名和之前的不同,所以圆兵,我們需要保證舊的地址也能重定向到地址中去跺讯,我們就在舊的系統(tǒng)的node層中作了一個重定向,代碼類似這樣:
這里沒有設置狀態(tài)碼殉农,發(fā)現(xiàn)默認是302跳轉(zhuǎn)刀脏,然后我們設置了301狀態(tài)碼,類似這樣:
用fiddle抓包(上面的302調(diào)整我就不上圖了)超凳,看到效果:
以上是使用Express愈污,用nodejs原生的代碼實現(xiàn)類似這樣: