《http權威指南》第3章在講解30x狀態碼時,完全沒有講清楚為什麼要有302、303、307,以及他們的關係,一句「問題出在http/1/1」讓我一頭霧水,莫名其妙;而第五章在講重定向響應時,沒有說到現在很常見的302,反而是說我從沒遇到過的303和307。很是迷惑,對於這3個狀態碼,wiki和rfc文件都有詳解,下面我以我的思維添油加醋的描述一遍。
rfc1945(也就是http1.0在介紹302時說,如果客戶端發出post請求後,收到服務端的302狀態碼,那麼不能自動的向新的uri傳送重複請求,必須跟使用者確認是否該重發,因為第二次post時,環境可能已經發生變化(嗯,post方法不是冪等的),post操作會不符合使用者預期。但是,很多瀏覽器(user agent我描述為瀏覽器以方便介紹)在這種情況下都會把post請求變為get請求。
rfc2616(也就是http1.1在介紹302時說,如果客戶端發出非get、head請求後,收到服務端的302狀態碼,那麼就不能自動的向新uri傳送重複請求,除非得到使用者的確認。(又是-,-)但是,很多瀏覽器都把302當作303處理了(注意,303是http1.1才加進來的,其實從http1.0進化到http1.1,瀏覽器什麼都沒動),它們獲取到http響應報文頭部的location欄位資訊,並發起乙個get請求。
從上面的介紹可以知道,http1.1和http1.0的302狀態碼意義是一樣的,瀏覽器對它的處理也是一樣的。post方法的重定向在未詢問使用者的情況下就變成get,這種不符合文件規範的問題依然存在。實踐在前而文件在後,http1.1把這種post變get的行為納入了rfc文件:http1.1新加入303和307狀態碼。
文件中規定303狀態碼的響應,也就是上邊提到的現在瀏覽器對302狀態碼的處理:post重定向為get。
http1.1文件中307狀態碼則相當於http1.0文件中的302狀態碼,當客戶端的post請求收到服務端307狀態碼響應時,需要跟使用者詢問是否應該在新uri上發起post方法,也就是說,307是不會把post轉為get的。
從網路上搜尋到這個說法「303:對於post請求,它表示請求已經被處理,客戶端可以接著使用get方法去請求location裡的uri。 307:對於post請求,表示請求還沒有被處理,客戶端應該向location裡的uri重新發起post請求。」,從上面的介紹可以明白,這個說法是臆想而已,文件並沒有這麼說,而業界是否統一如此處理,還不好說,我沒有抓到過307和303的包。
文件也說到,為相容很多http1.1之前的瀏覽器,服務端在需要發出303狀態碼時,會選擇用302狀態碼替代;而對於307的處理,則需要在響應實體中包含資訊,以便不能處理307狀態碼的使用者有能力在新uri中發起重複請求,也就是說,把重定向的頁面展示給使用者,讓使用者去點重定向uri鏈結(uri現在基本就是url)。
三、總結
303和307是http1.1新加的伺服器響應文件的狀態碼,它們是對http1.0中的302狀態碼的細化,主要用在對非get、head方法的響應上。文件規定:瀏覽器對303狀態碼的處理跟原來瀏覽器對http1.0的302狀態碼的處理方法一樣;瀏覽器對307狀態碼處理則跟原來http1.0文件裡對302的描述一樣。
303和307的存在,歸根結底是由於post方法的非冪等屬性引起的。
在http1.1中,302理論上是要被放棄掉的,它被細化為303和307,但為了相容,它目前還在業界中大量使用,而303和307狀態碼我還沒遇到過(沒有使用場景,也沒抓到過這樣的響應報文)。為什麼業界少使用303和307呢?對於get和head方法來說,307是沒必要存在的,用302或者303就可以滿足需求了,307僅在post方法的重定向上有用處。所以我猜測它們少見的原因有兩方面:1、post方法重定向的使用場景太少,使得307狀態碼沒有用武之地;2、get方法雖然常需要使用的重定向,但使用302狀態碼也能正確運轉,再考慮到微乎其微的相容問題(現在的瀏覽器怎麼可能不支援http1.1呢!),也就沒有使用303的必要了。
HTTP狀態碼302 303和307
原文出處 http權威指南 第3章在講解30x狀態碼時,完全沒有講清楚為什麼要有302 303 307,以及他們的關係,一句 問題出在http 1 1 讓我一頭霧水,莫名其妙 而第五章在講重定向響應時,沒有說到現在很常見的302,反而是說我從沒遇到過的303和307。很是迷惑,對於這3個狀態碼,wi...
HTTP狀態碼302 303和307的故事
http權威指南 第3章在講解30x狀態碼時,完全沒有講清楚為什麼要有302 303 307,以及他們的關係,一句 問題出在http 1 1 讓我一頭霧水,莫名其妙 而第五章在講重定向響應時,沒有說到現在很常見的302,反而是說我從沒遇到過的303和307。很是迷惑,對於這3個狀態碼,wiki和rf...
HTTP狀態碼302 303和307的前世今生
參考 http權威指南 第3章在講解30x狀態碼時,完全沒有講清楚為什麼要有302 303 307,以及他們的關係,一句 問題出在http1.1 而第五章在講重定向響應時,沒有說到現在很常見的302,反而是說我從沒遇到過的303和307。對於這3個狀態碼,wiki和rfc文件都有詳解,下面我們簡單介...