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