似乎沒好好研究過HTTP狀態碼

bay1發表於2018-06-22

title: 似乎沒好好研究過HTTP狀態碼 date: 2017-10-29 21:48:11 tags: [HTTP,網路協議]

這幾天小組值班的時候總是聽學長提起面試,也順便搜了下一些傳說中的面經.... 發現差距還是挺大的,甚至這個狀態碼的問題也沒好好總結過 為了證明自己做過程式設計師.............就重新記錄下

絕大部分為《圖解HTTP》筆記

總述

HTTP 狀態碼負責表示客戶端 HTTP 請求的返回結果、標記伺服器端 的處理是否正常、通知出現的錯誤等工作 狀態碼由3位數字組成,第一位是原因分類代表,剩下的兩位沒有特殊分類

型別 類別 原因
1XX Informational(資訊性狀態碼) 接受的請求正在處理
2XX Success(成功狀態碼) 請求正常處理完畢
3XX Redirection(重定向狀態碼) 需要進行附加操作以完成請求
4XX Client Error(客戶端錯誤狀態碼) 伺服器無法處理請求
5XX 5XX Server Error(伺服器錯誤狀態碼) 伺服器處理請求錯誤

常見的大概一共有14種

2XX

200 OK

這個狀態碼應該是最常見也是我們最想見到的,代表客戶端傳送的請求被服務端正常處理 同時在響應報文內,隨狀態碼返回的資訊會隨著HTTP方法不同而不同

常見的請求方法是GET和POST,但不僅僅這兩種,通常有以下8種方法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT

200

204 No Content

這個狀態碼代表的意思就是客戶端傳送的請求被服務端正常處理了 但是服務端並沒有返回任何實體內容

一般在只需要從客戶端往伺服器傳送資訊,而對客戶端不需要傳送新 資訊內容的情況下使用

206 Partial Content

該狀態碼錶示客戶端進行了範圍請求,而伺服器成功執行了這部分的GET請求 對於206的定義是請求必須包含Range頭來標示我們想要的範圍

因此這就是說我們可以通過Range和206 Partial Content來分塊獲取一個大檔案

3XX

301 Moved Permanently

永久性重定向

該狀態碼錶示請求的url資源被分配了新的url 如果已經把資源對應的URI儲存為書籤了 但是此時新的URL在Location頭中給出,瀏覽器應該自動地儲存和訪問新的URL

302 Found

臨時性重定向

從總的描述中我們可以看出這個狀態碼和301相似 只是該狀態碼屬於臨時性分配新的url 在本次的訪問中應使用新得url,同時不用更新書籤

303 See Other

這個狀態碼也代表訪問存在新的url,但應注意的是這個 狀態碼明確表示客戶端應該採用GET方法獲取資源

比如當使用POST方法訪問CGI程式其執行後的處理結果是希望客戶端能以GET方法重定向 到另一個URI上去時,返回303狀態碼。雖然302 Found狀態碼也可以實現相同的功能,但 這裡使用303狀態碼是最理想的

304 Not Modified

該狀態碼錶示客戶端傳送附帶條件的請求時,304狀態碼返回時,不包含任何響應的主體部分 伺服器告訴客戶,原來緩衝的文件還可以繼續使用 304雖然被劃分在3XX類別中,但是和重定向沒有關係

比如在包含If-Modified的網頁中,伺服器會自動完成 Last Modified 和 If Modified Since 的比較,完成快取或者更新 而動態頁面則是在訊息頭中定義Last Modified,最後形成這樣的結果

第一次訪問 200 滑鼠點選二次訪問 (Cache) 按F5重新整理 304 按Ctrl+F5強制重新整理 200

附帶條件的請求是指採用 GET 方法的請求報文中包含 If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since 中任一首部

307 Temporary Redirect

臨時重定向

這個狀態碼和302含義一樣,不過上面沒有說到

當 301、302、303響應狀態碼返回時,幾乎所有的瀏覽器都會把POST改成 GET,並刪除請求報文內的主體,之後請求會自動再次傳送 301、302標準是禁止將POST方法改變成GET方法的,但實際使用時大家都還是會那麼做

而這個307比較聽話,會遵照瀏覽器標準,不會從POST變成GET

4XX

400 Bad Request

該狀態碼錶示請求報文中存在語法錯誤。當錯誤發生時,需修改請求的內容後再次傳送請求

401 Unauthorized

該狀態碼錶示傳送的請求需要有通過HTTP認證(BASIC認證、DIGEST 認證)的認證資訊。另外若之前已進行過1次請求,則表示使用者認證失敗

401

403 Forbidden

這個狀態碼也是比較常見的,表示嘗試請求訪問的資源被禁止訪問 未獲得檔案系統的訪問授權,訪問許可權出現某些問題(從未授權的傳送源IP 地址試圖訪問)等列舉的情況都可能是發生403的原因

404 Found

又一個常見的狀態碼,表示伺服器沒有此資源 也可能是伺服器無情的拒絕了你,但不想告訴你為什麼

這個在python的開發中我主要見到的主要是路由未定義而導致的404

5XX

500 Internal Server Error

該狀態碼錶明伺服器端在執行請求時發生了錯誤。也有可能是Web應用存在的bug或某些臨時的故障

這個正如官方解釋,在開發中將常遇到的問題就是程式碼錯誤,至少我碰到的是這樣

503 Service Unavailable

這個狀態碼代表的是伺服器超過負載或者停機維護,無法處理請求

關於狀態碼和響應

不少返回的狀態碼響應都是錯誤的,但是使用者可能察覺不到這點。比如 Web 應用程式內部發生錯誤,狀態碼依然返回200 OK,這種情況也經常遇到

參考:狀態碼維基百科 304 Not Modified狀態碼 304是什麼意思

相關文章