php 状态码302,HTTP状态码302、303和307的故事
今日讀書,無法理解HTTP302、303、307狀態(tài)碼的來龍去脈,決定對其做深究并總結(jié)于本文。
《HTTP權(quán)威指南》第3章在講解30X狀態(tài)碼時(shí),完全沒有講清楚為什么要有302、303、307,以及他們的關(guān)系,一句“問題出在HTTP/1/1”讓我一頭霧水,莫名其妙;而第五章在講重定向響應(yīng)時(shí),沒有說到現(xiàn)在很常見的302,反而是說我從沒遇到過的303和307。很是迷惑,對于這3個(gè)狀態(tài)碼,WiKi和RFC文檔都有詳解,下面我以我的思維添油加醋的描述一遍。
一、狀態(tài)碼——302
RFC1945(http://tools.ietf.org/html/rfc1945#page-34),也就是HTTP1.0在介紹302時(shí)說,如果客戶端發(fā)出POST請求后,收到服務(wù)端的302狀態(tài)碼,那么不能自動的向新的URI發(fā)送重復(fù)請求,必須跟用戶確認(rèn)是否該重發(fā),因?yàn)榈诙蜳OST時(shí),環(huán)境可能已經(jīng)發(fā)生變化(嗯,POST方法不是冪等的),POST操作會不符合用戶預(yù)期。但是,很多瀏覽器(user agent我描述為瀏覽器以方便介紹)在這種情況下都會把POST請求變?yōu)镚ET請求。
RFC2616(http://tools.ietf.org/html/rfc2616#section-10.3.3),也就是HTTP1.1在介紹302時(shí)說,如果客戶端發(fā)出非GET、HEAD請求后,收到服務(wù)端的302狀態(tài)碼,那么就不能自動的向新URI發(fā)送重復(fù)請求,除非得到用戶的確認(rèn)。(又是-,-)但是,很多瀏覽器都把302當(dāng)作303處理了(注意,303是HTTP1.1才加進(jìn)來的,其實(shí)從HTTP1.0進(jìn)化到HTTP1.1,瀏覽器什么都沒動),它們獲取到HTTP響應(yīng)報(bào)文頭部的Location字段信息,并發(fā)起一個(gè)GET請求。
二、狀態(tài)碼——303和307
從上面的介紹可以知道,HTTP1.1和HTTP1.0的302狀態(tài)碼意義是一樣的,瀏覽器對它的處理也是一樣的。POST方法的重定向在未詢問用戶的情況下就變成GET,這種不符合文檔規(guī)范的問題依然存在。實(shí)踐在前而文檔在后,HTTP1.1把這種POST變GET的行為納入了RFC文檔:HTTP1.1新加入303和307狀態(tài)碼。
文檔中規(guī)定303狀態(tài)碼的響應(yīng),也就是上邊提到的現(xiàn)在瀏覽器對302狀態(tài)碼的處理:POST重定向?yàn)镚ET。
HTTP1.1文檔中307狀態(tài)碼則相當(dāng)于HTTP1.0文檔中的302狀態(tài)碼,當(dāng)客戶端的POST請求收到服務(wù)端307狀態(tài)碼響應(yīng)時(shí),需要跟用戶詢問是否應(yīng)該在新URI上發(fā)起POST方法,也就是說,307是不會把POST轉(zhuǎn)為GET的。
從網(wǎng)絡(luò)上搜索到這個(gè)說法“303:對于POST請求,它表示請求已經(jīng)被處理,客戶端可以接著使用GET方法去請求Location里的URI。 307:對于POST請求,表示請求還沒有被處理,客戶端應(yīng)該向Location里的URI重新發(fā)起POST請求。”,從上面的介紹可以明白,這個(gè)說法是臆想而已,文檔并沒有這么說,而業(yè)界是否統(tǒng)一如此處理,還不好說,我沒有抓到過307和303的包。
文檔也說到,為兼容很多HTTP1.1之前的瀏覽器,服務(wù)端在需要發(fā)出303狀態(tài)碼時(shí),會選擇用302狀態(tài)碼替代;而對于307的處理,則需要在響應(yīng)實(shí)體中包含信息,以便不能處理307狀態(tài)碼的用戶有能力在新URI中發(fā)起重復(fù)請求,也就是說,把重定向的頁面展示給用戶,讓用戶去點(diǎn)重定向URI鏈接(URI現(xiàn)在基本就是URL)。
三、總結(jié)
303和307是HTTP1.1新加的服務(wù)器響應(yīng)文檔的狀態(tài)碼,它們是對HTTP1.0中的302狀態(tài)碼的細(xì)化,主要用在對非GET、HEAD方法的響應(yīng)上。文檔規(guī)定:瀏覽器對303狀態(tài)碼的處理跟原來瀏覽器對HTTP1.0的302狀態(tài)碼的處理方法一樣;瀏覽器對307狀態(tài)碼處理則跟原來HTTP1.0文檔里對302的描述一樣。
303和307的存在,歸根結(jié)底是由于POST方法的非冪等屬性引起的。
在HTTP1.1中,302理論上是要被放棄掉的,它被細(xì)化為303和307,但為了兼容,它目前還在業(yè)界中大量使用,而303和307狀態(tài)碼我還沒遇到過(沒有使用場景,也沒抓到過這樣的響應(yīng)報(bào)文)。為什么業(yè)界少使用303和307呢?對于GET和HEAD方法來說,307是沒必要存在的,用302或者303就可以滿足需求了,307僅在POST方法的重定向上有用處。所以我猜測它們少見的原因有兩方面:1、POST方法重定向的使用場景太少,使得307狀態(tài)碼沒有用武之地;2、GET方法雖然常需要使用的重定向,但使用302狀態(tài)碼也能正確運(yùn)轉(zhuǎn),再考慮到微乎其微的兼容問題(現(xiàn)在的瀏覽器怎么可能不支持HTTP1.1呢!),也就沒有使用303的必要了。
本文所在:http://www.cnblogs.com/cswuyg/p/3871976.html
參考資料:
2、RFC1945?http://tools.ietf.org/html/rfc1945#page-34
3、RFC2616?http://tools.ietf.org/html/rfc2616#section-10.3.3
cswuyg @ 2014.7.27
有疑問加站長微信聯(lián)系(非本文作者)
總結(jié)
以上是生活随笔為你收集整理的php 状态码302,HTTP状态码302、303和307的故事的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使命召唤手游暗影归来手册怎么样
- 下一篇: 电脑除尘多少钱啊?