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