HTTP狀態碼(HTTP Status Code),用以表示網頁服務器超文本傳輸協議響應狀態的3位數字代碼。所有狀態碼的第一個數字代表了響應的五種狀態之一。所示的消息短語是典型的,但是可以提供任何可讀取的替代方案。除非另有說明,狀態碼是HTTP / 1.1標準(RFC 7231)的一部分。簡單來講,HTTP狀態碼的作用是服務器告訴客戶端當前請求響應的狀態,通過狀態碼就能判斷和分析服務器的運行狀態。
一、1XX(請求正在處理)
1XX:代表請求已被接受,需要繼續處理。這類響應是臨時響應,只包含狀態行和某些可選的響應頭信息,并以空行結束。常見的有:
100:(繼續)客戶端應當繼續發送請求。這個臨時響應是用來通知客戶端它的部分請求已經被服務器接收,且仍未被拒絕。客戶端應當繼續發送請求的剩余部分,或者如果請求已經完成,忽略這個響應。服務器必須在請求完成后向客戶端發送一個最終響應。
101:(切換協議)服務器已經理解了客戶端的請求,并將通過Upgrade 消息頭通知客戶端采用不同的協議來完成這個請求。在發送完這個響應最后的空行后,服務器將會切換到在Upgrade 消息頭中定義的那些協議。注意:只有在切換新的協議更有好處的時候才應該采取類似措施。例如,切換到新的HTTP 版本比舊版本更有優勢,或者切換到一個實時且同步的協議以傳送利用此類特性的資源。
二、2XX(請求成功處理)
2XX:代表成功處理了請求的狀態代碼。常見的有:
200:(成功) 服務器已成功處理了請求。通常,這表示服務器提供了請求的網頁。
201:(已創建) 請求已經被實現,而且有一個新的資源已經依據請求的需要而建立,且其 URI 已經隨Location 頭信息返回。假如需要的資源無法及時建立的話,應當返回 '202'。
202:(已接受) 服務器已接受請求,但尚未處理。正如它可能被拒絕一樣,最終該請求可能會也可能不會被執行。在異步操作的場合下,沒有比發送這個狀態碼更方便的做法了。
203:(非授權信息) 服務器已成功處理了請求,但返回的實體頭部元信息不是在原始服務器上有效的確定集合,而是來自本地或者第三方的拷貝。當前的信息可能是原始版本的子集或者超集。
204:(無內容) 服務器成功處理了請求,但不需要返回任何實體內容,并且希望返回更新了的元信息。響應可能通過實體頭部的形式,返回新的或更新后的元信息。如果存在這些頭部信息,則應當與所請求的變量相呼應。
205:(重置內容) 服務器成功處理了請求,且沒有返回任何內容。但是與204響應不同,返回此狀態碼的響應要求請求者重置文檔視圖。該響應主要是被用于接受用戶輸入后,立即重置表單,以便用戶能夠輕松地開始另一次輸入。
206:(部分內容) 服務器已經成功處理了部分 GET 請求。類似于 FlashGet 或者迅雷這類的 HTTP下載工具都是使用此類響應實現斷點續傳或者將一個大文檔分解為多個下載段同時下載。
三、3XX(表示重定向)
3XX:代表要完成請求,需要進一步操作。通常,這些狀態代碼用來重定向。常見的有:
300:(多種選擇) 被請求的資源有一系列可供選擇的回饋信息,每個都有自己特定的地址和瀏覽器驅動的商議信息。用戶或瀏覽器能夠自行選擇一個首選的地址進行重定向。
301:(永久移動) 請求的網頁已永久移動到新位置。服務器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
302:(臨時移動) 服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
303:(查看其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。
304:(未修改) 如果客戶端發送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內容(自上次訪問以來或者根據請求的條件)并沒有改變,則服務器應當返回這個狀態碼。304響應禁止包含消息體,因此始終以消息頭后的第一個空行結尾。
305:(使用代理) 請求者只能使用代理訪問請求的網頁。如果服務器返回此響應,還表示請求者應使用代理。
306:在最新版的規范中,306狀態碼已經不再被使用。
307:(臨時重定向)請求的資源臨時從不同的URI 響應請求。
四、4XX(表示請求錯誤)
4XX:表示請求可能出錯,妨礙了服務器的處理。常見的有:
400:(錯誤請求):語義有誤,當前請求無法被服務器理解。除非進行修改,否則客戶端不應該重復提交這個請求;或是請求參數有誤。
401:(未授權):當前請求需要用戶驗證。對于需要登錄的網頁,服務器可能返回此響應。
403:(禁止):服務器已經理解請求,但是拒絕執行它。與401響應不同的是,身份驗證并不能提供任何幫助,而且這個請求也不應該被重復提交。
404:(未找到):請求失敗,請求所希望得到的資源未被在服務器上發現。
405:(方法禁用):請求行中指定的請求方法不能被用于請求相應的資源。
406:(不接受):請求的資源的內容特性無法滿足請求頭中的條件,因而無法生成響應實體。
407:(需要代理授權):與401響應類似,只不過客戶端必須在代理服務器上進行身份驗證。代理服務器必須返回一個 Proxy-Authenticate 用以進行身份詢問。客戶端可以返回一個 Proxy-Authorization 信息頭用以驗證。
408:(請求超時):請求超時。客戶端沒有在服務器預備等待的時間內完成一個請求的發送。
五、5XX(表示服務器錯誤)
5XX:表示服務器在嘗試處理請求時發生內部錯誤。這些錯誤可能是服務器本身的錯誤,而不是請求出錯。常見的有:
500:(服務器內部錯誤):服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在服務器端的源代碼出現錯誤時出現。
501:(尚未實施):服務器不支持當前請求所需要的某個功能。當服務器無法識別請求的方法,并且無法支持其對任何資源的請求。
502:(錯誤網關):作為網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
503:(服務不可用):由于臨時的服務器維護或者過載,服務器當前無法處理請求。這個狀況是臨時的,并且將在一段時間以后恢復。
504:(網關超時):作為網關或者代理工作的服務器嘗試執行請求時,未能及時從上游服務器(URI標識出的服務器,例如HTTP、FTP、LDAP)或者輔助服務器(例如DNS)收到響應。
505:(HTTP 版本不受支持):服務器不支持,或者拒絕支持在請求中使用的 HTTP 版本。這暗示著服務器不能或不愿使用與客戶端相同的版本。響應中應當包含一個描述了為何版本不被支持以及服務器支持哪些協議的實體。
六、日常適用場景
一些常見狀態碼的適用場景:
100
客戶端應當繼續發送請求。這個臨時響應是用來通知客戶端它的部分請求已經被服務器接收,且仍未被拒絕。服務端收到請求,并表示可以繼續。在客戶端準備推送較大的數據時,可以用 100 表示允許。
206
服務器已經成功處理了部分 GET 請求。類似于 FlashGet 或者迅雷這類的 HTTP下載工具都是使用此類響應實現斷點續傳或者將一個大文檔分解為多個下載段同時下載。
301
永久重定向。請求的資源被永久移動到其他位置。假如我們的一篇博客的 url 地址發生了永久的改變,但用戶收藏夾里的鏈接還是舊的,我們就可以在用戶請求舊鏈接時,返回 301 狀態碼,并賦上一個重定向地址。
302
臨時重定向。原始描述短語為 Moved Temporarily。適合一些臨時的重定向操作,比如因為服務器崩潰導致一些頁面無法提供正確的訪問,在修復期間,則可以通過 302 先暫時地重定向到一個新的地址。修復完后再讓用戶繼續訪問原鏈接。302 不會持久緩存,但可以設置緩存時間持續一段時間。
403
服務器已經理解請求,但是拒絕執行它。與401響應不同的是,身份驗證并不能提供任何幫助,而且這個請求也不應該被重復提交。
404
請求失敗,請求所希望得到的資源未被在服務器上發現。廣為人知的狀態碼,代表 url 對應資源不存在。比如一些文章被刪除,是直接在數據庫中進行不可逆地徹底刪除的。然后就導致用戶訪問這個頁面時,服務器找不到對應數據,然后就返回一個 404,并提示 “頁面不存在”。
503
由于臨時的服務器維護或者過載,服務器當前無法處理請求。這個狀況是臨時的,并且將在一段時間以后恢復。
504
網關超時。網關還在,但后端服務因為各種原因(比如因為一個死循環卡死了),導致一直沒有響應回來,在過了一段時間后網關了依舊沒能收到消息,就會給客戶端返回 504 網關超時。
總結
狀態碼可以分為5類:
1XX表示請求正在處理;
2XX表示請求已經成功處理;
3XX表示重定向;
4xx表示請求錯誤;
5xx表示服務器錯誤。