HTTP 狀態碼負責表示客户端 HTTP 請求的返回結果、標記服務器端的處理是否正常、通知出現的錯誤等工作。
狀態碼告知從服務器端返回的請求結果
狀態碼的職責是當客户端向服務器端發送請求時,描述返回的請求結果。藉助狀態碼,用户可以知道服務器端是正常處理了請求,還是出現了錯誤。
狀態碼如 200 OK,以 3 位數字和原因短語組成。
數字中的第一位指定了響應類別,後兩位無分類。響應類別有以下 5 種。
只要遵守狀態碼類別的定義,即使改變 RFC2616 中定義的狀態碼, 或服務器端自行創建狀態碼都沒問題。
僅記錄在 RFC2616 上的 HTTP 狀態碼就達 40 種,若再加上 WebDAV和附加 HTTP 狀態碼等擴展,數量就達 60 餘種。別看種類繁多,實際上經常使用的大概只有 14 種。接下來,我們就介紹一下這些具有代表性的 14 個狀態碼。
2XX 成功
2XX 的響應結果表明請求被正常處理了。
200 OK
表示從客户端發來的請求在服務器端被正常處理了。
在響應報文內,隨狀態碼一起返回的信息會因方法的不同而發生改變。比如,使用 GET 方法時,對應請求資源的實體會作為響應返回;而使用 HEAD 方法時,在響應中只返回首部,不會返回實體的主體部分。
204 No Content
該狀態碼代表服務器接收的請求已成功處理,但在返回的響應報文中不含實體的主體部分。另外,也不允許返回任何實體的主體。比如,當從瀏覽器發出請求處理後,返回 204 響應,那麼瀏覽器顯示的頁面不發生更新。
一般在只需要從客户端往服務器發送信息,而對客户端不需要發送新信息內容的情況下使用。
206 Partial Content
該狀態碼錶示客户端進行了範圍請求,而服務器成功執行了這部分的 GET 請求。響應報文中包含由 Content-Range 指定範圍的實體內容。
3XX 重定向
3XX 響應結果表明瀏覽器需要執行某些特殊的處理以正確處理請求。
301 Moved Permanently
永久性重定向。該狀態碼錶示請求的資源已被分配了新的 URI,以後應使用資源現在所指的 URI。也就是説,就是説瀏覽器在拿到服務器返回的這個狀態碼後會自動跳轉到一個新的URI,這個地址可以從響應的Location首部中獲取(用户看到的效果就是他輸入的地址A瞬間變成了另一個地址B)。
像下方給出的請求 URI,當指定資源路徑的最後忘記添加斜槓“/”,就會產生 301 狀態碼。
http://example.com/sample
302 Found
臨時性重定向。該狀態碼錶示請求的資源已被分配了新的 URI,希望用户(本次)能使用新的 URI 訪問。 和 301 Moved Permanently 狀態碼相似,但 302 狀態碼代表的資源不是被永久移動,只是臨時性質的。也可以理解為舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B。
303 See Other
該狀態碼錶示由於請求對應的資源存在着另一個 URI,應使用 GET 方法定向獲取請求的資源。
303 狀態碼和 302 Found 狀態碼有着相同的功能,但 303 狀態碼明確表示客户端應當採用 GET 方法獲取資源,這點與 302 狀態碼有區別。
比如,當使用 POST 方法訪問 CGI 程序,其執行後的處理結果是希望客户端能以 GET 方法重定向到另一個 URI 上去時,返回 303 狀態碼。
304 Not Modified
該狀態碼錶示客户端發送附帶條件的請求時,服務器端允許請求訪問資源,但未滿足條件的情況。304 狀態碼返回時,不包含任何響應的主體部分。304 雖然被劃分在 3XX 類別中,但是和重定向沒有關係。
附帶條件的請求是指採用 GET方法的請求報文中包含 If-Match,If-Modified- Since,If-None-Match,If-Range,If-Unmodified-Since 中任一首部。
307 Temporary Redirect
臨時重定向。該狀態碼與 302 Found 有着相同的含義。儘管 302 標準禁止 POST 變換成 GET,但實際使用時大家並不遵守。
307 會遵照瀏覽器標準,不會從 POST 變成 GET。但是,對於處理響應時的行為,每種瀏覽器有可能出現不同的情況。
4XX 客户端錯誤
4XX 的響應結果表明客户端是發生錯誤的原因所在。
400 Bad Request
該狀態碼錶示請求報文中存在語法錯誤。當錯誤發生時,需修改請求的內容後再次發送請求。另外,瀏覽器會像 200 OK 一樣對待該狀態碼。
401 Unauthorized
該狀態碼錶示發送的請求需要有通過 HTTP 認證(BASIC 認證、DIGEST認證)的認證信息。另外若之前已進行過 1 次請求,則表示用户認證失敗。
返回含有 401 的響應必須包含一個適用於被請求資源的 WWW-Authenticate 首部用以質詢(challenge)用户信息。當瀏覽器初次接收到 401 響應,會彈出認證用的對話窗口。
403 Forbidden
該狀態碼錶明對請求資源的訪問被服務器拒絕了。服務器端沒有必要給出拒絕的詳細理由,但如果想作説明的話,可以在實體的主體部分對原因進行描述,這樣就能讓用户看到了。
404 Not Found
該狀態碼錶明服務器上無法找到請求的資源。除此之外,也可以在服務器端拒絕請求且不想説明理由時使用。
5XX 服務器錯誤
5XX 的響應結果表明服務器本身發生錯誤。
500 Internal Server Error
該狀態碼錶明服務器端在執行請求時發生了錯誤。也有可能是 Web 應用存在的 bug 或某些臨時的故障。
503 Service Unavailable
該狀態碼錶明服務器暫時處於超負載或正在進行停機維護,現在無法處理請求。如果事先得知解除以上狀況需要的時間,最好寫入 RetryAfter 首部字段再返回給客户端。