天天看點

Http協定之301,302和307

Http協定是有狀态碼的,比較熟悉的狀态碼是200,代表連結OK,還有404和403,一個是not found,另一個是forbidden。Not found不用多說,可能是位址欄輸入有誤,或者是網頁已經被移動。Forbidden的原因有很多,有可能是IP被伺服器拉入黑名單,有可能是IP過分密集的通路該網站,被網站防火牆屏蔽,有可能是域名解析到了空間,但是空間沒有綁定域名,也有可能是網頁腳本檔案在目前目錄下沒有執行權限。

上面說的都是2字頭和4字頭的狀态碼,但是比較關鍵的是3字頭的狀态碼---301、302。

先寫一個PHP,PHP的内容是指定使用301的方式,重定向到百度,然後在浏覽器的位址欄上輸入這個PHP的檔案位址之後,就會蹦出百度的界面,檢視其狀态就是301,如圖:

<a href="http://s2.51cto.com/wyfs02/M01/7C/E1/wKioL1ba2iSzPafXAAJAr6iIEks473.png" target="_blank"></a>

301的意思是“永久性重定向别的URL”,302的意思是“臨時性的重定向”。使用302的方法的話,重複上面的實驗,會看到狀态碼是302,而且回複頭資訊會多一個location: www.baidu.com,就是代表重定向的目的地是百度這個網址。

這裡說的“永久重定向”和“臨時重定向”并不是那種時間上的“永久和臨時”,不是說采用了臨時重定向,再關機或者重新開機之後,重定向的功能就消失了。比如使用搜尋引擎搜尋“網易”,需要在位址欄輸入www.163.net,那麼以後即使www.163.net的位址改變了,輸入www.163.com伺服器會自動連結到新位址www.wangyi.com,那麼這時候使用301的話,就等于直接登陸www.wangyi.com,徹底忘記www.163.net的存在。如果是302的話,會先www.163.net,然後www.163.net的伺服器傳回資訊給客戶機,你真實需要去的是www.wangyi.com,然後客戶機再去跟www.wangyi.com産生連結。

一般來說,最好使用301,這樣更安全,而且省下了一步中間資訊傳回的步驟。

比如說有一個頁面,是注冊使用者頁面,需要輸入賬号、密碼、手機号、電子郵箱和驗證碼這五個資訊。在使用者輸入完以上的資訊之後,頁面會有一個跳轉,提示“注冊成功”或者“注冊失敗”,這個幾秒鐘的跳轉也是重定向,如果成功了就會從這個短暫的界面重定向到正式登陸成功的界面,同時使用者的資料就會被記錄到背景的資料庫裡,儲存到伺服器裡。

但是要知道,在PHP寫法裡使用301或者302的話,假設還是在上面的例子裡,使用者的資訊在重定向的界面是沒有被儲存的,檢查一下傳回頭資訊會很輕松的發現,傳回頭資訊開始的時候是POST,但是到了重定向的界面會變成GET。GET是獲得,自然不會把資訊存入資料庫裡,使用者的資訊錄入等于白寫。

舉個例子:假設05.php是使用者寫注冊資訊的網頁,使用者填寫完所有資訊之後,系統重定向到06.php這個網頁。如果這個重定向使用的是302 or 301,那麼在06.php上,其實是沒有任何的使用者輸入的資訊的!如圖:

<a href="http://s5.51cto.com/wyfs02/M00/7C/E1/wKioL1ba3GHzFjl9AAQLbk1gFZ8501.png" target="_blank"></a>

<a href="http://s2.51cto.com/wyfs02/M02/7C/E3/wKiom1ba3gGT7UPhAADZmfVz_6c364.png" target="_blank"></a>

302不用試了,把301抹去,預設就是302的方法,兩個方法都是一樣的效果,資料丢失。

這個時候怎麼辦?使用307,307就是在重定向中依舊保持原有的資料。

在上面的圖裡把301改成307,一切問題迎刃而解。而且可以看到,在05.php就是POST,在06.php裡依舊還是POST。

<a href="http://s4.51cto.com/wyfs02/M02/7C/E3/wKiom1ba3yzx018vAAFpN35O-9A872.png" target="_blank"></a>

版權聲明:原創作品,如需轉載,請注明出處。否則将追究法律責任

 本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1747923