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