聊聊HTTP狀態(tài)碼完整指南,你學(xué)會了嗎?
一、HTTP 狀態(tài)碼概述
1. 概念
當我們在瀏覽器輸入URL并按下Enter鍵時,瀏覽器就會向站點的服務(wù)器發(fā)送一個HTTP請求,服務(wù)器接收并處理請求,然后將相關(guān)資源和HTTP標頭一起返回??梢栽跒g覽器的Network中查看 HTTP 的請求狀態(tài)碼:

維基百科中對HTTP狀態(tài)碼的解釋:
HTTP狀態(tài)碼(HTTP Status Code)是用以表示網(wǎng)頁服務(wù)器超文本傳輸協(xié)議響應(yīng)狀態(tài)的3位數(shù)字代碼。它由 RFC 2616 規(guī)范定義的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 與 RFC 4918 等規(guī)范擴展。所有狀態(tài)碼被分為五類,狀態(tài)碼的第一個數(shù)字代表了響應(yīng)的五種狀態(tài)之一。所示的消息短語是典型的,但是可以提供任何可讀取的替代方案。除非另有說明,狀態(tài)碼是HTTP/1.1標準(RFC 7231)的一部分。
HTTP 狀態(tài)代碼是從 Web 服務(wù)器發(fā)送的 3 位代碼(如 200 OK 或 404 Not Found),用于讓我們和搜索引擎知道請求中是否存在任何錯誤或服務(wù)器嘗試處理請求時是否存在任何問題。
2. 分類
應(yīng)用通常就是客戶端向服務(wù)器發(fā)出請求,服務(wù)器做出響應(yīng)。狀態(tài)碼就是讓我們知道 HTTP 請求是成功、失敗還是其他。HTTP狀態(tài)碼通常分為五類:
類別 | 定義 | 描述 |
1xx | Informational(信息性狀態(tài)碼) | 接受的請求正在處理 |
2xx | Success(成功狀態(tài)碼) | 請求正常處理完畢 |
3xx | Redirection(重定向狀態(tài)碼) | 需要進行附加操作來完成請求 |
4xx | Client Error (客戶端錯誤狀態(tài)碼) | 服務(wù)器無法處理請求 |
5xx | Server Error(服務(wù)器錯誤狀態(tài)碼) | 服務(wù)器處理請求出錯 |
3. 重要性
HTTP 狀態(tài)代碼對于診斷應(yīng)用問題很重要,例如網(wǎng)絡(luò)服務(wù)器是否無法正常工作且無法提供頁面等。快速發(fā)現(xiàn)這些問題對于開發(fā)人員和搜索引擎提供良好的體驗非常重要。那為什么 HTTP 狀態(tài)代碼和錯誤對搜索引擎優(yōu)化 (SEO) 很重要呢?
搜索引擎機器人在抓取網(wǎng)站時會看到 HTTP 狀態(tài)碼。在某些情況下,這些會影響網(wǎng)頁是否以及如何被編入索引,以及搜索引擎如何看待網(wǎng)站的健康狀況。
一般來說,1XX 和 2XX 狀態(tài)碼不會對 SEO 產(chǎn)生太大影響。因為它們表明網(wǎng)站上是正常運行的,并使搜索引擎機器人能夠繼續(xù)執(zhí)行操作。但是,它們并不會提高網(wǎng)站的排名。在大多數(shù)情況下,對 SEO 重要的是更高級別的代碼。4XX 和 5XX 響應(yīng)會阻止機器人抓取和索引頁面。錯誤太多也可能表明網(wǎng)站質(zhì)量不高,可能會降低網(wǎng)站的排名。
3XX 狀態(tài)碼與 SEO 的關(guān)系就會復(fù)雜很多。要想了解它們的影響,就需要了解永久重定向和臨時重定向之間的區(qū)別,這里先不解釋,后面再詳細介紹??傊瑢σ呀?jīng)遷移的頁面使用永久重定向會有更好的SEO。
可以使用 Google Search Console,在覆蓋率報告中查看 3XX、4XX 和 5XX 的狀態(tài)代碼:

這個報告中會顯示網(wǎng)站中四種類型的頁面:
- 返回錯誤的頁面;
- 有警告但是有效的頁面;
- 有效的頁面;
- 從索引中排除的頁面;
我們可以在除了有效頁面之外的三類中找到3XX、4XX、5XX 的HTTO狀態(tài)碼的頁面,具體的話取決于狀態(tài)碼類型,比如301重定向可能會出現(xiàn)在最后一種中。

二、HTTP 狀態(tài)碼列表
4XX 和 5XX 狀態(tài)碼可能會出現(xiàn)在Error下。
1. 1xx Informational
1XX的狀態(tài)碼是在HTTP/1.1 中引入的,它們是信息性的狀態(tài)碼,是臨時的,表示請求已被接受,需要繼續(xù)處理。這些狀態(tài)碼并沒有提供太多有用的信息,我們可能永遠看不到1XX相關(guān)的狀態(tài)碼。
(1)100 Continue
服務(wù)器已收到瀏覽器的請求標頭,并且現(xiàn)在已準備好發(fā)送請求正文。這使得請求過程更加高效,因為它可以防止瀏覽器發(fā)送正文請求,即使標頭已被拒絕。
(2)101 Switching Protocols
服務(wù)器已經(jīng)接受了客戶端的請求,并將通過Upgrade消息頭通知客戶端采用不同的協(xié)議來完成這個請求。在發(fā)送完這個響應(yīng)最后的空行后,服務(wù)器將會切換到在Upgrade消息頭中定義的協(xié)議。
(3)102 Processing
服務(wù)器已經(jīng)收到并正在處理請求,目前還沒有響應(yīng)。這樣可以防止客戶端超時,并假設(shè)請求丟失。
(4)103 Early hints
在服務(wù)器響應(yīng)的HTTP消息之前返回一些響應(yīng)頭。該狀態(tài)碼用于允許用戶代理預(yù)加載資源,同時服務(wù)器準備響應(yīng)。
2. 2xx Success
2xx 狀態(tài)碼表示客戶端的請求被成功接收、理解和接受。
(1)200 OK
表示客戶端發(fā)來的請求被服務(wù)器端正常處理了。從 SEO 的角度來看,200 OK 狀態(tài)碼是功能頁面的完美狀態(tài)碼,所有鏈接頁面都在正常工作。200 表示搜索引擎爬蟲可以成功爬取該頁面并將其放入其搜索引擎中。
(2)201 Created
服務(wù)器完成了瀏覽器的請求,因此創(chuàng)建了一個或多個新資源。
(3)202 Accepted
服務(wù)器已接受瀏覽器的請求,但仍在處理中。該請求最終可能會也可能不會進行響應(yīng)。
(4)203 Non-authoritative Information
使用代理時可能會出現(xiàn)此狀態(tài)代碼。這意味著代理服務(wù)器從源服務(wù)器收到了 200 狀態(tài)代碼,但在將響應(yīng)傳遞給瀏覽器之前已對其進行了修改。
(5)204 No Content
該狀態(tài)碼表示客戶端發(fā)送的請求已經(jīng)在服務(wù)器端正常處理了,但是沒有返回的內(nèi)容,響應(yīng)報文中不包含實體的主體部分。一般在只需要從客戶端往服務(wù)器端發(fā)送信息,而服務(wù)器端不需要往客戶端發(fā)送內(nèi)容時使用。
(6)205 Reset Content
服務(wù)器端成功處理了請求,且沒有返回任何內(nèi)容。但是與204響應(yīng)不同,返回此狀態(tài)碼的響應(yīng)要求請求者重置文檔視圖。該響應(yīng)主要是被用于接受用戶輸入后,立即重置表單,以便用戶能夠輕松地開始另一次輸入。
(7)206 Partial Content
該狀態(tài)碼表示客戶端進行了范圍請求,而服務(wù)器端執(zhí)行了這部分的 GET 請求。響應(yīng)報文中包含由 Content-Range 指定范圍的實體內(nèi)容。
(8)226 IM Used
服務(wù)器已成功處理瀏覽器的 GET 方法,以檢索已緩存資源的更新版本。通常,當請求的資源有一個或多個輕微修改時返回響應(yīng)。
3. 3xx Redirection
3XX 響應(yīng)結(jié)果表明瀏覽器需要執(zhí)行某些特殊的處理以正確處理請求。
(1)300 Multiple Choices
有時,服務(wù)器可能會響應(yīng)多種可能的資源來滿足瀏覽器的請求。300 狀態(tài)碼意味著瀏覽器現(xiàn)在需要在它們之間進行選擇。當有多個可用的文件類型擴展名時,可能會發(fā)生這種情況。
(2)301 Moved Permanently
永久重定向。已為目標資源分配了一個新的永久 URI。新的 URI 會在 HTTP 響應(yīng)頭中的 Location 首部字段指定。若用戶已經(jīng)把原來的URI保存為書簽,此時會按照 Location 中新的URI重新保存該書簽。同時,搜索引擎在抓取新內(nèi)容的同時也將舊的網(wǎng)址替換為重定向之后的網(wǎng)址。
(3)302 Found
臨時重定向。請求的資源被分配到了新的 URI,希望用戶(本次)能使用新的 URI 訪問資源。和 301 Moved Permanently 狀態(tài)碼相似,但是 302 代表的資源不是被永久重定向,只是臨時性質(zhì)的。也就是說已移動的資源對應(yīng)的 URI 將來還有可能發(fā)生改變。
若用戶把 URI 保存成書簽,但不會像 301 狀態(tài)碼出現(xiàn)時那樣去更新書簽,而是仍舊保留返回 302 狀態(tài)碼的頁面對應(yīng)的 URI。同時,搜索引擎會抓取新的內(nèi)容而保留舊的網(wǎng)址。因為服務(wù)器返回302代碼,搜索引擎認為新的網(wǎng)址只是暫時的。
使用場景:
未登陸的用戶訪問用戶中心重定向到登錄頁面。
訪問404頁面重新定向到首頁。
(4)303 See Other
由于請求對應(yīng)的資源存在著另一個 URI,應(yīng)使用 GET 方法定向獲取請求的資源。
303 狀態(tài)碼和 302 Found 狀態(tài)碼有著相似的功能,但是 303 狀態(tài)碼明確表示客戶端應(yīng)當采用 GET 方法獲取資源。303 狀態(tài)碼通常作為 PUT 或 POST 操作的返回結(jié)果,它表示重定向鏈接指向的不是新上傳的資源,而是另外一個頁面,比如消息確認頁面或上傳進度頁面。而請求重定向頁面的方法要總是使用 GET。
注意:
當 301、302、303 響應(yīng)狀態(tài)碼返回時,幾乎所有的瀏覽器都會把 POST 改成GET,并刪除請求報文內(nèi)的主體,之后請求會再次自動發(fā)送。
301、302 標準是禁止將 POST 方法變成 GET方法的,但實際大家都會這么做。
(5)304 Not Modified
瀏覽器緩存相關(guān)。該狀態(tài)碼表示客戶端發(fā)送附帶條件的請求時,服務(wù)器端允許請求訪問資源,但未滿足條件的情況。304 狀態(tài)碼返回時,不包含任何響應(yīng)的主體部分。304 雖然被劃分在 3XX 類別中,但是和重定向沒有關(guān)系。
帶條件的請求(Http 條件請求):使用 Get方法 請求,請求報文中包含(if-match、if-none-match、if-modified-since、if-unmodified-since、if-range)中任意首部。
狀態(tài)碼304并不是一種錯誤,而是告訴客戶端有緩存,直接使用緩存中的數(shù)據(jù)。返回頁面的只有頭部信息,是沒有內(nèi)容部分的,這樣在一定程度上提高了網(wǎng)頁的性能。
(6)305 Use Proxy
服務(wù)器需要代理才能返回請求的資源。此響應(yīng)代碼當前未使用,因為當前大多數(shù)瀏覽器由于安全問題不支持它。
(7)307 Temporary Redirect
臨時重定向。該狀態(tài)碼與 302 Found 有著相同含義,盡管 302 標準禁止 POST 變成 GET,但是實際使用時還是用了。307 會遵守瀏覽器標準,不會從 POST 變成 GET。但是對于處理請求的行為時,不同瀏覽器還是會出現(xiàn)不同的情況。規(guī)范要求瀏覽器繼續(xù)向 Location 的地址 POST 內(nèi)容。規(guī)范要求瀏覽器繼續(xù)向 Location 的地址 POST 內(nèi)容。
(8)308 Permanent Redirect
永久重定向,當前及未來的請求重定向到了新的 URL。
4. 4xx Client errors
(1)400 Bad Request
請求報文中存在語法錯誤。當錯誤發(fā)生時,需修改請求的內(nèi)容后再次發(fā)送請求。
(2)401 Unauthorized
發(fā)送的請求需要有通過 HTTP 認證(BASIC 認證、DIGEST 認證)的認證信息。若之前已進行過一次請求,則表示用戶認證失敗。返回含有 401 的響應(yīng)必須包含一個適用于被請求資源的 WWW-Authenticate 首部用以質(zhì)詢(challenge)用戶信息。當瀏覽器初次接收到 401 響應(yīng),會彈出認證用的對話窗口。
(3)402 Payment Required
為數(shù)字支付系統(tǒng)保留的。不過,它并沒有被廣泛使用。
(4)403 Forbidden
客戶端請求已被拒絕,因為客戶端無權(quán)訪問內(nèi)容。與 401 不同,服務(wù)器知道客戶端的身份,但由于他們無權(quán)查看內(nèi)容,因此服務(wù)器拒絕提供正確的響應(yīng)。
(5)404 Not Found
服務(wù)器上無法找到請求的資源,但將來可能可用。除此之外,也可以在服務(wù)器端拒絕請求且不想說明理由時使用。
(6)405 Method Not Allowed
服務(wù)器識別到瀏覽器使用的 HTTP 請求方法,但需要使用不同的方法才能提供所需的資源。服務(wù)器應(yīng)該總是允許客戶端使用 GET 和 HEAD 方法進行訪問。
客戶端可以通過 OPTIONS 方法(預(yù)檢)來查看服務(wù)器允許的訪問方法, 如下
Access-Control-Allow-Methods: GET,HEAD,PUT,PATCH,POST,DELETE
(7)406 Not Acceptable
服務(wù)器通知客戶端沒有資源符合瀏覽器請求的標準。
(8)407 Proxy Authentication Required
客戶端必須首先通過代理進行身份驗證。
(9)408 Request Timeout
當服務(wù)器在等待來自瀏覽器的完整請求時超時時會生成此狀態(tài)碼。換句話說,服務(wù)器沒有收到瀏覽器發(fā)送的完整請求。一種可能的原因就是網(wǎng)絡(luò)擁塞導(dǎo)致瀏覽器和服務(wù)器之間的數(shù)據(jù)包丟失。
(10)409 Conflict
服務(wù)器無法處理瀏覽器的請求,因為與相關(guān)資源存在沖突。這有時是由于多個同時編輯而發(fā)生的。
(11)410 Gone
請求的資源將來將不再可用。
(12)411 Length Required
請求的資源需要客戶端指定一定的長度,通過 Content-Length 來定義。
(13)412 Precondition Failed
服務(wù)器不滿足請求頭字段中指示的一個或多個先決條件。
(14)413 Payload Too Large
服務(wù)器拒絕處理請求,因為請求的負載大于服務(wù)器能夠或愿意處理的。雖然服務(wù)器可能會關(guān)閉連接以阻止客戶端繼續(xù)請求,但它應(yīng)該生成一個 Retry-After 頭字段以及客戶端可以在多長時間后重試。
(15)414 Request-URI Too Long
瀏覽器發(fā)出的請求無法被服務(wù)器處理,因為客戶端將太多數(shù)據(jù)編碼為查詢字符串,然后作為 GET 方法發(fā)送。
(16)415 Unsupported Media Type
請求已被服務(wù)器拒絕,因為它不支持請求數(shù)據(jù)的媒體格式。
(17)416 Requested Range Not Satisfiable
請求的 Range 頭中指定的范圍無法滿足。原因可能是給定范圍超出了目標 URI 數(shù)據(jù)的大小。
(18)417 Expectation Failed
服務(wù)器無法滿足請求的請求頭的 Expect 字段中指定的要求。
(19)421 Misdirected Request
瀏覽器的請求已被重定向到其他服務(wù)器,該服務(wù)器無法產(chǎn)生響應(yīng)。
(20)422 Unprocessable Entity
瀏覽器發(fā)出的請求中存在語義錯誤,服務(wù)器無法處理。
(21)423 Locked
對所需資源的訪問被拒絕,因為它已被鎖定。
(22)424 Failed Dependency
瀏覽器發(fā)出的請求失敗,因為它依賴于另一個請求,而該請求失敗了。
(23)426 Upgrade Required
當服務(wù)器拒絕使用當前協(xié)議執(zhí)行給定的請求時,它可能愿意在客戶端升級到不同的協(xié)議后這來執(zhí)行請求。
(24)428 Precondition Required
服務(wù)器要求在處理請求之前指定條件。
(25)429 Too Many Requests
用戶在給定的時間內(nèi)發(fā)送了太多請求(速率限制)時,這是由服務(wù)器生成的。這有時可能是由于機器人或腳本試圖訪問站點而造成的。
(26)431 Request Header Fields Too Large
服務(wù)器無法處理請求,因為標頭字段太大。這可能是單個標頭字段或所有標頭字段存在問題。
(27)451 Unavailable For Legal Reasons
服務(wù)器的運營商收到了禁止訪問請求的資源的要求。
(28)499 Client closed request
當 nginx 正在處理請求時,客戶端關(guān)閉了連接,nginx 就會返回此狀態(tài)碼。
5. 5xx Server Error
5XX 的響應(yīng)結(jié)果表明服務(wù)器本身發(fā)生錯誤。
(1)500 Internal Server Error
服務(wù)器端在執(zhí)行請求時發(fā)生了錯誤。也有可能是應(yīng)用存在 bug 或某些臨時的故障。
(2)501 Not Implemented
請求無法處理,因為服務(wù)器不支持。
(3)502 Bad Gateway
該扮演網(wǎng)關(guān)或代理角色的服務(wù)器從上游服務(wù)器中接收到的響應(yīng)是無效的。注意,502 錯誤通常不是客戶端能夠修復(fù)的,而是需要由途經(jīng)的服務(wù)器或者代理服務(wù)器對其進行修復(fù)
(4)503 Service Unavailable
服務(wù)器暫時處于超負載或正在進行停機維護,現(xiàn)在無法處理請求。
使用場景:
服務(wù)器停機維護時,主動用503響應(yīng)請求;
nginx 設(shè)置限速,超過限速,會返回503。
(5)504 Gateway Timeout
網(wǎng)關(guān)或者代理的服務(wù)器無法在規(guī)定的時間內(nèi)獲得想要的響應(yīng)。它是HTTP 1.1中新加入的。
使用場景:
代碼執(zhí)行時間超時;
代碼發(fā)生了死循環(huán)。
(6)505 HTTP Version Not Supported
請求中使用的 HTTP 版本不受服務(wù)器支持。
(7)506 Variant Also Negotiates
服務(wù)器內(nèi)部配置錯誤。
(8)507 Insufficient Storage
服務(wù)器無法存儲完成請求所必須的內(nèi)容。
(9)508 Loop Detected
服務(wù)器在處理請求時檢測到無限循環(huán)。
(10)510 Not Extended
服務(wù)器需要進一步擴展才能滿足請求。
(11)511 Network Authentication Required
客戶端需要進行身份驗證才能獲得訪問權(quán)限。





































