HTTP協議狀態碼詳解(HTTP Status Code)

使用ASP.NET/PHP/JSP 或者javascript都會用到http的不一樣狀態,一些常見的狀態碼爲:  
200 – 服務器成功返回網頁 404 – 請求的網頁不存在 503 – 服務不可用    
1xx(臨時響應)    
表示臨時響應並須要請求者繼續執行操做的狀態代碼。javascript

代碼   說明  
100   (繼續) 請求者應當繼續提出請求。 服務器返回此代碼表示已收到請求的第一部分,正在等待其他部分。 
101   (切換協議) 請求者已要求服務器切換協議,服務器已確認並準備切換。html

2xx (成功)  
表示成功處理了請求的狀態代碼。前端

代碼   說明  
200   (成功)  服務器已成功處理了請求。 一般,這表示服務器提供了請求的網頁。    
201   (已建立)  請求成功而且服務器建立了新的資源。    
202   (已接受)  服務器已接受請求,但還沒有處理。    
203   (非受權信息)  服務器已成功處理了請求,但返回的信息可能來自另外一來源。    
204   (無內容)  服務器成功處理了請求,但沒有返回任何內容。    
205   (重置內容) 服務器成功處理了請求,但沒有返回任何內容。    
206   (部份內容)  服務器成功處理了部分 GET 請求。java

3xx (重定向)  
表示要完成請求,須要進一步操做。 一般,這些狀態代碼用來重定向。後端

代碼   說明  
300   (多種選擇)  針對請求,服務器可執行多種操做。 服務器可根據請求者 (user agent) 選擇一項操做,或提供操做列表供請求者選擇。    
301   (永久移動)  請求的網頁已永久移動到新位置。 服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。    
302   (臨時移動)  服務器目前從不一樣位置的網頁響應請求,但請求者應繼續使用原有位置來進行之後的請求。    
303   (查看其餘位置) 請求者應當對不一樣的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。    
304   (未修改) 自從上次請求後,請求的網頁未修改過。 服務器返回此響應時,不會返回網頁內容。    
305   (使用代理) 請求者只能使用代理訪問請求的網頁。 若是服務器返回此響應,還表示請求者應使用代理。    
307   (臨時重定向)  服務器目前從不一樣位置的網頁響應請求,但請求者應繼續使用原有位置來進行之後的請求。服務器

4xx(請求錯誤)  
這些狀態代碼表示請求可能出錯,妨礙了服務器的處理。網絡

代碼   說明  
400   (錯誤請求) 服務器不理解請求的語法。    
401   (未受權) 請求要求身份驗證。 對於須要登陸的網頁,服務器可能返回此響應。    
403   (禁止) 服務器拒絕請求。    
404   (未找到) 服務器找不到請求的網頁。    
405   (方法禁用) 禁用請求中指定的方法。    
406   (不接受) 沒法使用請求的內容特性響應請求的網頁。    
407   (須要代理受權) 此狀態代碼與 401(未受權)相似,但指定請求者應當受權使用代理。    
408   (請求超時)  服務器等候請求時發生超時。    
409   (衝突)  服務器在完成請求時發生衝突。 服務器必須在響應中包含有關衝突的信息。    
410   (已刪除)  若是請求的資源已永久刪除,服務器就會返回此響應。    
411   (須要有效長度) 服務器不接受不含有效內容長度標頭字段的請求。    
412   (未知足前提條件) 服務器未知足請求者在請求中設置的其中一個前提條件。    
413   (請求實體過大) 服務器沒法處理請求,由於請求實體過大,超出服務器的處理能力。    
414   (請求的 URI 過長) 請求的 URI(一般爲網址)過長,服務器沒法處理。    
415   (不支持的媒體類型) 請求的格式不受請求頁面的支持。    
416   (請求範圍不符合要求) 若是頁面沒法提供請求的範圍,則服務器會返回此狀態代碼。    
417   (未知足指望值) 服務器未知足」指望」請求標頭字段的要求。網站

429   Rate Limited,The user has sent too many requests in a given amount of time.ui

461   Domain Forbidden,The request cannot be completed due to an invalid HOST header,eg IP or blank.Triggered by the block invalid host feature.代理

463   Restricted Client,Request is denied based on the User-agent restrictions for the site.

499   Client Closed Request,Connection has been closed by client while the server is still processing its request.

5xx(服務器錯誤)  
這些狀態代碼表示服務器在嘗試處理請求時發生內部錯誤。 這些錯誤多是服務器自己的錯誤,而不是請求出錯。

代碼   說明  
500   (服務器內部錯誤)  服務器遇到錯誤,沒法完成請求,通常爲服務器的設置或內部程序問題致使。例如:SELinux開啓,而又沒有爲HTTP設置規則許可,客戶端訪問就是500.   
501   (還沒有實施) 服務器不具有完成請求的功能。 例如,服務器沒法識別請求方法時可能會返回此代碼。    
502   (錯誤網關) 服務器做爲網關或代理,從上游服務器收到無效響應。通常是代理服務器請求後端服務時,後端服務不可用或沒有完成響應網關服務器,這一般爲反向代理服務器下面的節點出問題所致。   
503   (服務不可用) 服務器目前沒法使用(因爲超載或停機維護)。 一般,這只是暫時狀態。    
504   (網關超時)  通常是網關代理服務器請求後端服務時,後端服務沒有在特定時間內完成處理請求,多數是服務器過載致使沒有在指定時間內返回數據給前端代理服務器。    
505   (HTTP 版本不受支持) 服務器不支持請求中所用的 HTTP 協議版本。

 

RFC 6585 最近剛剛發佈,該文檔描述了 4 個新的 HTTP 狀態碼。

HTTP 協議還在變化?是的,HTTP 協議一直在演變,新的狀態碼對於開發 REST 服務或者說是基於 HTTP 的服務很是有用,下面咱們爲你詳細介紹這四個新的狀態碼以及是否應該使用。

428 Precondition Required (要求先決條件)

先決條件是客戶端發送 HTTP 請求時,若是想要請求能成功必須知足一些預設的條件。

一個好的例子就是 If-None-Match 頭,常常在 GET 請求中使用,若是指定了 If-None-Match ,那麼客戶端只在響應中的 ETag 改變後纔會從新接收回應。

先決條件的另一個例子就是 If-Match 頭,這個通常用在 PUT 請求上用於指示只更新沒被改變的資源,這在多個客戶端使用 HTTP 服務時用來防止彼此間不會覆蓋相同內容。

當服務器端使用 428 Precondition Required 狀態碼時,表示客戶端必須發送上述的請求頭才能執行請求,這個方法爲服務器提供一種有效的方法來阻止 'lost update' 問題。

429 Too Many Requests (太多請求)

當你須要限制客戶端請求某個服務數量時,該狀態碼就頗有用,也就是請求速度限制。

在此以前,有一些相似的狀態碼,例如 '509 Bandwidth Limit Exceeded'. Twitter 使用 420 (這不是HTTP定義的狀態碼)

若是你但願限制客戶端對服務的請求數,可以使用 429 狀態碼,同時包含一個 Retry-After 響應頭用於告訴客戶端多長時間後能夠再次請求服務。

431 Request Header Fields Too Large (請求頭字段太大)

某些狀況下,客戶端發送 HTTP 請求頭會變得很大,那麼服務器可發送 431 Request Header Fields Too Large 來指明該問題。

我不太清楚爲何沒有 430 狀態碼,而是直接從 429 跳到 431,我嘗試搜索但沒有結果。惟一的猜想是 430 Forbidden 跟 403 Forbidden 太像了,爲了不混淆才這麼作的,天知道!

511 Network Authentication Required (要求網絡認證)

對我來講這個狀態碼頗有趣,若是你在開發一個 HTTP 服務器,你不必定須要處理該狀態碼,但若是你在編寫 HTTP 客戶端,那這個狀態碼就很是重要。

若是你頻繁使用筆記本和智能手機,你可能會注意到大量的公用 WIFI 服務要求你必須接受一些協議或者必須登陸後才能使用。

這是經過攔截HTTP流量,當用戶試圖訪問網絡返回一個重定向和登陸,這很討厭,可是實際狀況就是這樣的。

使用這些「攔截」客戶端,會有一些討厭的反作用。在 RFC 中有提到這兩個的例子:

  • 若是你在登陸WIFI前訪問某個網站,網絡設備將會攔截首個請求,這些設備每每也有本身的網站圖標 ‘favicon.ico'。登陸後您會發現,有一段時間內你訪問的網站圖標一直是WIFI登陸網站的圖標。

  • 若是客戶端使用HTTP請求來查找文檔(多是JSON),網絡將會響應一個登陸頁,這樣你的客戶端就會解析錯誤並致使客戶端運行異常,在現實中這種問題很是常見。

所以 511 狀態碼的提出就是爲了解決這個問題。

若是你正在編寫 HTTP 的客戶端,你最好仍是檢查 511 狀態碼以確認是否須要認證後才能訪問。

相關文章
相關標籤/搜索