常見的HTTP狀態碼深入理解

JerryC發表於2016-05-25

狀態碼的職責是當客戶端向伺服器端傳送請求時,描述返回請求結果。藉助狀態碼,使用者可以知道伺服器端是正常處理了請求,還是出現了什麼錯誤。

RFC2616定義的狀態碼,由3位數字和原因簡訊組成。

數字中的第一位指定了響應類別,後兩位無分類。響應類別有以下5種:

Type Reason-phrase Note
1XX Informational 資訊性狀態碼,表示接受的請求正在處理
2XX Success 成功狀態碼,表示請求正常處理完畢
3XX Redirection 重定向狀態碼,表示需要客戶端需要進行附加操作
4XX Client Error 客戶端錯誤狀態碼,表示伺服器無法處理請求
5XX Server Error 伺服器錯誤狀態碼,表示伺服器處理請求出錯

RFC2616記錄的HTTP狀態碼有37種,再加上「WebDAV」(RFC49185842)和「Additional HTTP Status Codes」(RFC6585),數量就達到60多種。

然並卵,這麼多種HTTP狀態碼,其實常用的大概只有14種,本文就講講這14種狀態碼。

2XX Success

This class of status code indicates that the client’s request was successfully received, understood, and accepted.

2xx 響應結果表示從客戶端發來的請求在伺服器端被正常處理了。

200 OK

請求被成功處理,伺服器會根據不同的請求方法返回結果:

  • GET:請求的對應資源會作為響應返回。
  • HEAD:請求的對應資源的響應頭(entity-header)會作為響應返回,不包括響應體(message-body)。
  • POST:返回處理對應請求的結果。

204 No Content

該狀態碼錶示伺服器接收到的請求已經處理完畢,但是伺服器不需要返回響應體.

比如,客戶端是瀏覽器的話,發出的請求返回204響應,那麼瀏覽器顯示的頁面不會發生更新。

206 Partial Content

該狀態碼錶示客戶端進行了範圍請求,而伺服器成功執行了這部分的GET請求。

客戶端發起的請求,必須在請求頭中包含Range欄位。服務端響應報文中,必須包含由Content-Range指定範圍的實體內容(entity-bodies )

3XX Redirection

This class of status code indicates that further action needs to be taken by the user agent in order to fulfill the request.

3XX 響應結果表明瀏覽器需要執行某些特殊的處理以完成請求。

301 Movied Permanently

永久性重定向。該狀態碼錶示請求的資源已經被分配了新的URI,並且以後使用資源現在所指的URI。並且根據請求的方法有不同的處理方式:

  • HEAD:必須在響應頭部Location欄位中指明新的永久性的URI。
  • GET:除了有Location欄位以外,還需要在響應體中附上永久性URI的超連結文字。
  • POST:客戶端在傳送POST請求,受到301響應之後,不應該自動跳轉URI,應當讓使用者確認跳轉。

比如,如果一個URI已經在瀏覽器中被收藏為書籤,這時應該按照Location首部欄位提示的URI重新儲存。

例如建立一個收藏的書籤:

http://wan.bigertech.com

當訪問這個書籤的時候,請求會被重定向到

http://wan.meizu.com

並且對應的書籤會被改變,指向http://wan.meizu.com

不信?Try yourself.

302 Found

臨時性重定向。該狀態碼錶示請求的資源已被分配了新的URI,希望使用者本次能使用新的URI訪問。

和301 Moved Permanently 狀態碼相似,但302狀態碼代表的資源不是被永久移動,只是臨時性質的。

如果,使用者把一個URI收藏為書籤,302響應是不會像301那樣去更新書籤。

303 See Other

該狀態碼錶示由於請求對應的資源存在另一個URI,應使用GET方法定向獲取請求的資源。303與302不同之處在於,302是不會改變請求的方法,如果請求方法是POST的話,重定向的請求也應該是POST。而對於303,使用POST請求的話,重定向的請求應該是GET請求。

但是有一點是需要注意的,許多HTTP/1.1版以前的瀏覽器不能正確理解303狀態碼,很多現存的瀏覽器講302響應視為303響應,並且使用GET方式訪問Location中規定的的URI,而無視原先請求的方法。

在RFC2616中有相關的這樣一段原文:

Note: Many pre-HTTP/1.1 user agents do not understand the 303 status. When interoperability with such clients is a concern, the 302 status code may be used instead, since most user agents react to a 302 response as described here for 303.

304 Not Modified

該狀態碼錶示客戶端傳送附帶條件請求時,伺服器端允許請求訪問資源,但未滿足條件的情況。304狀態碼返回時,不包含任何響應的主題部分。附帶條件的請求指的是採用GET方法的請求頭中包含:If-MatchIf-Modified-SinceIf-None-MatchIf-RangeIf-Unmodified-Since中任一首部。

307 Temporary Redirect

臨時重定向。該狀態碼與302和303的有著類似的含義,不同之處在於,307狀態碼並不會指定客戶端要用什麼樣的請求方法請求重定向地址。(302指定使用原有請求方法,303指定使用GET方法)

4XX Client Error

The 4xx class of status code is intended for cases in which the client seems to have erred.

4XX 的響應結果表明客戶端是發生錯誤的原因所在

400 Bad Request

表示該請求報文中存在語法錯誤,導致伺服器無法理解該請求。客戶端需要修改請求的內容後再次傳送請求。

401 Unauthorized

該狀態碼錶示傳送的請求需要有通過HTTP認證(Basic認證,Digest認證)的認證資訊。返回含有401的響應,必須在頭部包含WWW-Authenticate以指明伺服器需要哪種方式的認證。

當客戶端再次請求該資源的時候,需要在請求頭中的Authorization包含認證資訊。

更多關於認證授權的資訊關注RFC2617

403 Forbidden

該狀態碼錶明對請求資源的訪問被伺服器拒絕了。伺服器沒有必要給出拒絕的詳細理由,但如果想做說明的話,可以在實體的主體部分原因進行描述,這樣就能讓使用者看到了。

未獲得檔案系統的訪問許可權,訪問許可權出現某些問題,從未授權的傳送源IP地址試圖訪問等情況都可能發生403響應。

404 Not Found

該狀態碼錶明伺服器上無法找到指定的資源。通常被用於伺服器不想透露拒絕請求的原因,或者沒有其他的響應可提供。

5XX Server Error

Response status codes beginning with the digit “5″ indicate cases in which the server is aware that it has erred or is incapable of performing the request.

5XX 的響應結果表明伺服器本身發生錯誤,或者沒有足夠的能力來處理請求。

500 Internal Server Error

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

503 Service Unavailable

該狀態碼錶明伺服器暫時處於超負載或正在進行停機維護,現在無法處理請求。如果事先得知解除以上需要的時間,最好寫入Retry-After首部欄位再返回給客戶端。

相關文章