標題皮了一下,可是內容應該算是比較用心的,不是直接抄了一下官方文檔和一堆抽象的術語,儘可能配合實例解釋的通俗一些。html
狀態碼(Status Code)和緣由短語(Reason Phrase)用於簡單描述請求的結果。常見的好比:前端
緣由短語(上面的ok 和Not Found)是對狀態碼的解釋說明。nginx
形如200
這樣的狀態碼,這裏的3位數字
中第1位數字,一般表示響應的類別(會有一兩個例外),大體能夠分紅如下幾類(完整的狀態碼錶,參見http1.1-RFC6):segmentfault
狀態碼 | 含義 |
---|---|
1xx | 請求正被處理 |
2xx | 請求成功處理 |
3xx | 請求須要附加操做,常見的例子如重定向 |
4xx | 客戶端出錯致使請求沒法被處理 |
5xx | 服務端處理出錯 |
(4,5常被用在排查bug時先後端互相甩鍋-_-!)下面詳細介紹經常使用的狀態碼和緣由短語windows
表示請求已經被正常處理,這個比較常見,就很少說了。後端
表示請求成功,可是響應的報文中不含實體主體。一般用於只須要客戶端向服務端發送信息,而不須要接受新信息的狀況使用
(這麼官方且抽象的描述顯然不是個人風格),舉例:瀏覽器
如今很常見的一種請求類型option
,一般被用來作正式請求的預請求,這個請求只須要確認後續的請求能不能經過,即只須要一個結果,而不須要返回其餘內容,這類請求成功時就會返回204。緩存
相信你們小時候都常常考試,若是拿試題來打個比方,那麼:服務器
字面意思:只返回了請求資源的部分。這種狀況必須提到提到一個請求頭Range
——在http
的請求中,這個頭部用來表示範圍請求,例如:post
'Range':byte=5001-10000 // 表示本次要請求資源的5001-10000字節的部分
這種狀況下,若是服務器接受範圍請求而且成功處理,就會返回206
,而且在響應的頭部返回
'Content-Range':bytes 5001-10000/10000 // 表示整個資源有10000字節,本次返回的範圍爲 5001-10000字節
字面意思:資源被永久重定向了。這種狀況下響應的頭部字段Location
中通常還會返回一個地址,用來表示要新地址。例如:
客戶端發起一個請求,要訪問a站點,此時收到的響應以下:
301 Moved Permanently ... Location:`b.com` ... //上述內容表示:親,您請求的資源已經永久轉移啦,這邊建議您去新的地址b.com訪問呢,之後也請直接訪問新地址哦
字面意思:資源臨時重定向了。和301的惟一區別就在於一個是臨時,一個是永久:仍是舉上面的例子,響應以下:
302 Found ... Location:`b.com` ... //上述內容表示:親,您請求的資源被臨時轉移啦,後面也有可能再次轉移,因此這邊建議您本次去新的地址b.com訪問,之後的話仍是先訪問原來地址哦,有任何變化mm依然會熱心爲你解答
這個和302很像,可是有個細微區別是,除了會提示客戶端去請求Location
之外,還會要求請求要使用Location
時使用GET
方法。 在這補充一下一個歷史背景:
請求返回301 302 303 時,幾乎全部瀏覽器都會把原先的POST請求改成GET請求。雖然FRC1945和RFC2068規範中有規定:不容許客戶端在重定向時修改方法。
簡單的說,實際的瀏覽器在處理301和302時,默認就會把原先的POST請求改成GET請求,因此實際上使用303的意義,單純只是讓語義化更清晰點。(303表示服務器明確告訴客戶端,你要使用GET
方法訪問location
;若是是302,就是僅僅告訴客戶端要訪問location
,不限制方法,可是實際上客戶端本身也會用GET
方法訪問。)
字面意思是:資源未改變,可直接使用緩存。
這種響應通常是GET
請求中帶有附加條件,例如請求頭中含有if-Match,if-Modified-Since
等(if-Match
表示只請求帶有特殊標記的資源,if-Modified-Since
表示請求指定時間後未變動的資源,由於本文主要講解狀態碼,因此不在此引入太多http頭部的相關內容,這裏是爲了簡單解釋下附加條件請求的含義)。
這種狀況下,服務端不會返回響應主體,含義就是:」從你上次訪問以來這個資源都沒變過喲,直接使用你本地的緩存就行啦「。
304就是3xx裏面的一個特例,由於它不算是一個重定向。(通常咱們認爲重定向要給出一個新的地址讓客戶端去訪問,304若是必定要解釋爲重定向,只能解釋爲讓客戶端轉去訪問緩存-_-)
這個重定向是爲了解決前面剛剛介紹的一個歷史背景問題:302
時瀏覽器默認會轉用GET
方法去請求Location
,而若是是307
, 含義就是嚴格限制不容許從POST
轉爲GET
,這個目前我在實際工做中不多遇到。
4xx表示通常是客戶端發生了錯誤。(這位前端同窗,乖乖接了這個bug吧!)
(這個狀態碼相信你們必定很不陌生,特別是入門的新同窗~)400的含義簡單粗暴:「對不起,你的請求中有語法錯誤」,那具體是什麼語法錯誤呢? 答案是 —— 不必定,通常來講響應報文裏會有一些提示,例如:
字面意思:未通過認證。通常在後臺系統之類的應用裏,用戶登陸以後會得到一個身份認證信息,而後生成mac
之類的信息,放在請求頭的Authorization
字段裏,發送給服務端,若是這個認證信息有問題或者根本沒發送,就會出現這個狀態碼。
這個就簡單了:禁止訪問也就是無權限訪問。至於具體爲何禁止,服務器能夠在響應內容的實體部分給出,固然也能夠不給(沒錯,我服務端就是這麼了不得,隨心所欲!)
很常見了,字面含義,服務端沒有找到所請求的資源,經驗代表,通常這個錯誤是客戶端的請求url寫錯了。(別問我怎麼知道的)
5xx代表服務端發生了錯誤。(真是個使人開心的消息,老闆,你看不是個人問題!)
簡單粗暴,服務器故障了。啥?你問我什麼故障?我哪知道,我只會熟練地把bug轉給隔壁的服務端同窗。
評論區有讀者提到漏掉了502和504,想一想仍是補上吧,雖然要說明這倆還得稍微解釋下網關和代理(懶性暴露),可是平時開發的時候確實也常常出現,尤爲是使用nginx進行調試的時候。順便安利一下教程 windows下使用nginx調試
做爲網關或者代理工做的服務器嘗試執行請求時,從上游服務器接收到無效的響應。這裏說明下網關和代理服務器的概念:前面咱們舉例子都是直接客戶端向服務器發請求,實際上客戶端有時候不是直接向服務器請求,這中間可能存在網關和代理。畫個簡單的圖:
服務器暫時沒法使用,多是維護或者升級,反正沒法使用。
做爲網關或者代理工做的服務器訪問超時。
本文對常見的一些http狀態碼和緣由作了總結,一方面但願可以給更多入門的同窗提供幫助,一方面也作一個概括總結,方便平時排查bug時速查,文中有一部分可能涉及到了http頭部
的知識,雖然也想盡量剝離開來,可是爲了解釋說明無法也確實徹底分割開-_-。
慣例:若是內容有錯誤的地方歡迎指出(以爲看着不理解不舒服想吐槽也徹底沒問題);若是有幫助,歡迎點贊和收藏,轉載請徵得贊成後著明出處,若是有問題也歡迎私信交流,主頁有郵箱地址