????????在日常的網絡瀏覽和 Web 開發過程中,我們總會不可避免地遇到各種 HTTP 狀態碼。比如常見的 “404 Not Found”,它意味著我們所請求的頁面不存在;還有 “500 Internal Server Error”,表示服務器端出現了錯誤。這些由三位數字組成的代碼,看似簡單,卻承載著 Web 服務器與客戶端之間重要的通信信息,是排查網絡問題、優化 Web 應用性能的關鍵 “密碼”。本文將帶大家全面、深入地了解 HTTP 狀態碼,從基礎概念到各類狀態碼的詳細解讀,再到實際應用中的實用技巧,助你輕松掌握這一 Web 開發與網絡使用的必備知識。
一、HTTP 狀態碼的基礎認知
HTTP 狀態碼(HTTP Status Code)是由萬維網聯盟(W3C)定義的,用于表示 HTTP 請求處理結果的三位數字代碼。當客戶端(如瀏覽器、手機 App 等)向 Web 服務器發送一個 HTTP 請求后,服務器會根據請求的處理情況,返回一個包含狀態碼的響應頭,客戶端再根據這個狀態碼來判斷請求是否成功,并采取相應的后續操作。
HTTP 狀態碼的首位數字決定了其所屬的類別,共分為五大類,分別對應不同的響應情況,這為我們快速判斷請求問題所在提供了清晰的方向。
二、五大類 HTTP 狀態碼詳細解析
(一)1xx 信息性狀態碼:請求已接收,繼續處理
1xx 系列狀態碼屬于信息提示類,它表示服務器已經成功接收了客戶端發送的請求,并且正在對請求進行進一步的處理,同時告知客戶端需要繼續等待后續的響應。這類狀態碼在實際應用中并不常見,因為大部分客戶端會自動處理后續流程,不會將其直接展示給用戶。
- 100 Continue(繼續):當客戶端向服務器發送包含請求體的 POST 或 PUT 等請求時,會先發送一個不帶請求體、僅包含Expect: 100-continue頭字段的請求,用于詢問服務器是否愿意接收后續的請求體。如果服務器返回 100 Continue 狀態碼,就表示服務器已經做好了接收請求體的準備,客戶端可以繼續發送請求體;若服務器返回其他狀態碼(如 400 Bad Request),則客戶端需要停止發送請求體,并根據返回的狀態碼進行相應處理。例如,在文件上傳場景中,客戶端先發送請求頭部詢問服務器,服務器返回 100 Continue 后,客戶端才開始上傳文件數據,這樣可以避免在服務器無法處理該請求時,客戶端白白上傳大量數據,節省網絡資源。
- 101 Switching Protocols(切換協議):該狀態碼表示服務器同意根據客戶端的請求,將當前使用的 HTTP 協議切換為其他協議,比如 WebSocket 協議。在一些需要實時通信的應用中,如在線聊天、實時游戲數據同步等,客戶端會先通過 HTTP 協議向服務器發送請求,要求切換到 WebSocket 協議。當服務器返回 101 Switching Protocols 狀態碼時,就意味著協議切換成功,之后客戶端和服務器就可以通過新的協議進行高效的雙向通信,不再受 HTTP 協議單向請求 - 響應模式的限制。
(二)2xx 成功狀態碼:請求已成功處理
2xx 系列狀態碼是我們在網絡請求中最希望看到的,它們表示客戶端發送的 HTTP 請求已經被服務器成功接收、理解并處理完成,服務器會根據請求的類型返回相應的成功響應數據。
- 200 OK(成功):這是最常見的成功狀態碼,幾乎所有成功的 GET、POST、PUT 等請求(除了需要特殊處理的情況)都會返回該狀態碼。它表示服務器已經成功處理了客戶端的請求,并將請求的資源或處理結果通過響應體返回給客戶端。例如,當我們在瀏覽器中輸入網址訪問一個網頁時,若服務器正常響應,就會返回 200 OK 狀態碼,并將網頁的 HTML、CSS、JavaScript 等資源一并返回,瀏覽器再將這些資源渲染成我們看到的網頁;當我們在 App 中提交表單數據(如注冊、登錄),服務器驗證通過并處理完成后,也會返回 200 OK 狀態碼,同時可能返回用戶信息、操作成功提示等數據。
- 201 Created(已創建):該狀態碼通常用于 POST 請求,表示服務器已經成功根據客戶端的請求創建了新的資源。例如,在 RESTful API 開發中,當客戶端發送 POST 請求向服務器提交數據以創建一個新的用戶、一篇文章或一個訂單時,若創建成功,服務器會返回 201 Created 狀態碼,并且在響應頭的Location字段中指定新創建資源的 URI(統一資源標識符),客戶端可以通過該 URI 直接訪問新創建的資源。同時,響應體中可能會包含新創建資源的詳細信息,方便客戶端后續操作。比如,客戶端發送 POST 請求創建一個新用戶,服務器返回 201 Created,Location字段為/users/123,表示新用戶的 ID 為 123,客戶端后續可以通過訪問/users/123來獲取該用戶的信息。
- 204 No Content(無內容):此狀態碼表示服務器已經成功處理了客戶端的請求,但沒有返回任何響應體數據。它通常用于那些只需要服務器執行某個操作,而不需要返回具體資源內容的請求,比如 DELETE 請求刪除資源、PUT 請求更新資源但不需要返回更新后的資源詳情等。例如,當客戶端發送 DELETE 請求刪除一個不需要的文件或一條過期的數據時,服務器成功刪除后,會返回 204 No Content 狀態碼,告知客戶端操作已成功,但由于資源已被刪除,沒有額外的數據需要返回;當客戶端發送 PUT 請求更新用戶的部分信息(如修改密碼),服務器更新成功后,若不需要返回完整的用戶信息,也可以返回 204 No Content 狀態碼。
- 206 Partial Content(部分內容):該狀態碼用于斷點續傳和分片下載場景,表示服務器成功處理了客戶端的部分請求,只返回了請求資源的一部分。當客戶端需要下載一個較大的文件(如視頻、大型安裝包等)時,為了提高下載效率、避免因網絡中斷導致重新下載,客戶端會將文件分成多個部分,每次只請求其中的一部分,并在請求頭中通過Range字段指定請求的字節范圍(如Range: bytes=0-1023表示請求文件的前 1024 個字節)。服務器接收到這樣的請求后,會根據Range字段返回對應的部分文件數據,并返回 206 Partial Content 狀態碼,同時在響應頭中通過Content-Range字段告知客戶端當前返回數據的字節范圍以及整個文件的總大小(如Content-Range: bytes 0-1023/10240表示當前返回 0-1023 字節,文件總大小為 10240 字節)。客戶端接收到各部分數據后,會將它們拼接成完整的文件。
(三)3xx 重定向狀態碼:需要進一步操作以完成請求
3xx 系列狀態碼表示客戶端發送的請求需要通過進一步的操作(通常是跳轉至其他 URL)才能完成。服務器會通過響應頭中的Location字段指定客戶端需要跳轉的目標 URL,客戶端根據狀態碼的具體含義和Location字段的值進行相應的重定向操作。
- 301 Moved Permanently(永久重定向):該狀態碼表示請求的資源已經被永久地移動到了新的 URL(由Location字段指定),以后所有對該舊 URL 的請求都應該直接發送到新的 URL。搜索引擎在抓取網頁時,如果發現某個頁面返回 301 Moved Permanently 狀態碼,會將舊 URL 的權重和排名轉移到新 URL 上,不會對網站的 SEO(搜索引擎優化)造成負面影響。常見的應用場景包括:網站域名更換后,將舊域名的所有請求重定向到新域名;網站頁面結構調整,某個頁面的 URL 發生改變,將舊 URL 重定向到新 URL,以保證用戶通過舊鏈接仍能訪問到正確的內容。例如,舊網址http://old-example.com/page返回 301 狀態碼,Location字段為http://new-example.com/new-page,之后用戶再訪問舊網址時,瀏覽器會自動跳轉到新網址,且后續再次訪問該舊網址時,會直接從緩存中獲取新網址進行跳轉(部分瀏覽器會緩存 301 重定向)。
- 302 Found(臨時重定向):此狀態碼表示請求的資源臨時被移動到了新的 URL(由Location字段指定),但這種移動只是暫時的,未來資源可能還會回到原來的舊 URL。與 301 永久重定向不同,搜索引擎在遇到 302 臨時重定向時,不會將舊 URL 的權重轉移到新 URL 上,仍會保留舊 URL 的索引和排名。應用場景包括:網站進行臨時維護時,將所有請求重定向到一個臨時維護頁面;用戶未登錄時,訪問需要登錄才能查看的頁面,服務器將請求重定向到登錄頁面,用戶登錄成功后再跳轉回原來請求的頁面;電商網站在促銷活動期間,將某個商品的鏈接臨時重定向到活動專題頁面,活動結束后再恢復原來的鏈接。例如,用戶訪問http://example.com/member(需要登錄的會員頁面),若未登錄,服務器返回 302 Found 狀態碼,Location字段為http://example.com/login,瀏覽器自動跳轉到登錄頁面,用戶登錄后,服務器再將其重定向回http://example.com/member頁面。
- 304 Not Modified(未修改):該狀態碼用于緩存機制,表示客戶端請求的資源自上次請求以來沒有發生修改,服務器不需要返回完整的資源內容,客戶端可以直接使用本地緩存的資源。這一機制極大地減少了網絡傳輸的數據量,提高了網頁加載速度,降低了服務器的負載。其工作原理是:客戶端第一次請求資源時,服務器返回資源內容和響應頭,其中包含Last-Modified(資源最后修改時間)或ETag(資源的唯一標識,如文件哈希值)字段。當客戶端再次請求該資源時,會在請求頭中通過If-Modified-Since(對應Last-Modified)或If-None-Match(對應ETag)字段攜帶上次獲取的資源修改時間或標識。服務器接收到請求后,會根據這些字段判斷資源是否發生變化:若資源未修改,就返回 304 Not Modified 狀態碼,不返回響應體;若資源已修改,則返回 200 OK 狀態碼和更新后的資源內容。例如,我們第二次訪問同一個網頁時,瀏覽器會發送帶有If-Modified-Since或If-None-Match的請求,若網頁未更新,服務器返回 304,瀏覽器直接使用本地緩存的網頁數據進行渲染,讓網頁瞬間加載完成。
- 307 Temporary Redirect(臨時重定向,保持請求方法):307 狀態碼與 302 Found 類似,都表示資源臨時被移動到新 URL,但它有一個重要的區別:307 要求客戶端在重定向時必須保持原來的請求方法不變,而 302 在實際應用中,部分客戶端可能會將 POST 請求改為 GET 請求(這是不符合 HTTP 標準的,但由于歷史原因,一些瀏覽器存在這樣的行為)。在需要嚴格保持請求方法的場景下,應優先使用 307 Temporary Redirect。例如,客戶端通過 POST 請求向服務器提交表單數據,由于某些原因(如服務器臨時故障,需要將請求轉移到備用服務器),服務器需要將請求臨時重定向到新 URL。此時若使用 302 狀態碼,部分瀏覽器可能會將 POST 請求改為 GET 請求,導致表單數據無法正確提交;而使用 307 狀態碼,客戶端會嚴格按照原來的 POST 方法向新 URL 發送請求,確保數據提交的正確性。
- 308 Permanent Redirect(永久重定向,保持請求方法):308 狀態碼與 301 Moved Permanently 類似,都表示資源永久被移動到新 URL,但它同樣要求客戶端在重定向時保持原來的請求方法不變,這一點與 307 對應 302 的關系一致。在需要永久重定向且必須保持請求方法的場景下,應使用 308 Permanent Redirect 替代 301。例如,一個 API 接口的 URL 發生了永久性變更,且該接口主要接收 POST 請求。若使用 301 狀態碼進行重定向,部分客戶端可能會將 POST 請求改為 GET 請求,導致 API 無法正常工作;而使用 308 狀態碼,客戶端會始終以 POST 方法向新的 API URL 發送請求,保證 API 服務的連續性。
(四)4xx 客戶端錯誤狀態碼:請求存在錯誤,服務器無法處理
4xx 系列狀態碼表示客戶端發送的請求存在錯誤(如請求的資源不存在、權限不足、請求格式不正確等),導致服務器無法正常處理該請求。這類錯誤的責任通常在客戶端,需要客戶端修正請求后重新發送。
- 400 Bad Request(錯誤請求):該狀態碼表示服務器無法理解客戶端發送的請求,因為請求存在語法錯誤、參數缺失或參數格式不正確等問題。例如,客戶端向服務器發送 POST 請求提交表單數據時,未按照服務器要求的格式傳遞參數(如將數字類型的參數傳遞為字符串、缺少必填的表單字段);或者在發送 JSON 格式的請求體時,JSON 語法錯誤(如缺少引號、逗號使用錯誤等)。服務器接收到這樣的請求后,無法解析和處理,就會返回 400 Bad Request 狀態碼,并可能在響應體中說明具體的錯誤原因(如 “缺少必填參數:username”“JSON 格式錯誤:第 5 行缺少右引號”),幫助客戶端開發者排查問題。
- 401 Unauthorized(未授權):此狀態碼表示客戶端在請求需要身份驗證的資源時,未提供有效的身份憑證(如用戶名密碼、Token 令牌等),或者提供的憑證無效。服務器通過該狀態碼告知客戶端,需要先進行身份驗證才能訪問該資源。在響應頭中,服務器通常會通過WWW-Authenticate字段指定需要的身份驗證方式(如 Basic 認證、Bearer Token 認證等)。例如,用戶未登錄就直接訪問需要登錄的后臺管理系統頁面,或者客戶端在調用需要 Token 驗證的 API 接口時,未在請求頭中攜帶 Token,或攜帶的 Token 已過期、無效,服務器都會返回 401 Unauthorized 狀態碼。此時,客戶端需要引導用戶進行登錄操作(如跳轉到登錄頁面),或重新獲取有效的 Token 并攜帶在請求中,再次發送請求。
- 403 Forbidden(禁止訪問):該狀態碼表示客戶端已經通過了身份驗證(即服務器知道客戶端是誰),但客戶端所擁有的權限不足以訪問請求的資源,服務器拒絕提供該資源的訪問權限。與 401 Unauthorized(未驗證身份)不同,403 Forbidden 強調的是 “身份已驗證,但權限不夠”。例如,普通用戶登錄后臺管理系統后,嘗試訪問只有管理員才能查看的 “用戶管理”“系統設置” 等頁面;或者客戶端通過 API 接口請求獲取其他用戶的隱私數據(如查看其他用戶的訂單記錄、個人聯系方式),但該客戶端的賬號沒有對應的訪問權限,服務器都會返回 403 Forbidden 狀態碼。此時,即使客戶端重新提交身份憑證,只要權限未變更,請求仍會被拒絕,需要聯系管理員提升權限才能訪問。
- 404 Not Found(未找到):這是最廣為人知的客戶端錯誤狀態碼,表示客戶端請求的資源在服務器上不存在。導致 404 的原因有很多,比如:客戶端輸入的 URL 錯誤(如拼寫錯誤、網址路徑錯誤);服務器上的資源被刪除或移動,但未設置相應的重定向;網站路由配置錯誤,導致服務器無法將請求映射到正確的資源。例如,用戶想訪問http://example.com/about頁面,但實際網站中并沒有該頁面(正確路徑可能是http://example.com/about-us);或者服務器上原來存在的文件http://example.com/files/report.pdf被刪除,客戶端再次請求該文件時,服務器就會返回 404 Not Found 狀態碼。為了提升用戶體驗,很多網站會自定義 404 頁面,向用戶說明頁面不存在,并提供返回首頁、搜索等功能。
- 405 Method Not Allowed(方法不允許):該狀態碼表示客戶端使用的 HTTP 請求方法(如 GET、POST、PUT、DELETE 等)在當前請求的 URL 上不被允許。服務器會在響應頭的Allow字段中列出該 URL 支持的所有請求方法,幫助客戶端了解正確的請求方式。例如,某個 API 接口http://example.com/api/users只支持 GET(獲取用戶列表)和 POST(創建用戶)方法,若客戶端使用 PUT 方法向該接口發送請求(意圖更新用戶信息),服務器就會返回 405 Method Not Allowed 狀態碼,同時Allow字段會顯示GET, POST,告知客戶端該接口僅支持這兩種請求方法。此時,客戶端需要檢查請求方法是否符合服務器的接口規范,更換為允許的方法后重新發送請求。
- 406 Not Acceptable(無法接受):此狀態碼表示服務器無法返回客戶端在請求頭中通過Accept字段指定的格式或類型的資源。Accept字段用于客戶端告知服務器自己能夠處理的響應內容類型(如text/html、application/json、image/jpeg等)。如果服務器沒有客戶端可接受的資源類型,就會返回 406 Not Acceptable 狀態碼。例如,客戶端發送請求時,在請求頭中設置Accept: application/xml,表示只接受 XML 格式的響應數據,但服務器該接口僅能返回 JSON 格式的數據(application/json),無法滿足客戶端的要求,就會返回 406 狀態碼。此時,客戶端需要修改Accept字段,允許接收服務器支持的內容類型,或者服務器需要擴展支持的響應格式。
- 408 Request Timeout(請求超時):該狀態碼表示服務器在規定的時間內沒有收到客戶端發送的完整請求(包括請求頭和請求體)
三、總結
狀態碼 | 代碼名稱 | 所屬類別 | 核心說明 |
100 | Continue | 1xx 信息性狀態碼 | 服務器已接收請求頭,告知客戶端可繼續發送請求體,常用于文件上傳等場景避免資源浪費 |
101 | Switching Protocols | 1xx 信息性狀態碼 | 服務器同意按客戶端請求切換協議(如 HTTP 轉 WebSocket),支持實時雙向通信 |
200 | OK | 2xx 成功狀態碼 | 最常見成功碼,服務器已成功處理請求并返回對應資源或結果,適用于多數 GET、POST 等請求 |
201 | Created | 2xx 成功狀態碼 | 用于 POST 請求,服務器成功創建新資源,響應頭 Location 字段會指定新資源 URI |
204 | No Content | 2xx 成功狀態碼 | 服務器成功處理請求,但無響應體返回,適用于 DELETE 刪除資源、PUT 更新無需返回詳情等場景 |
206 | Partial Content | 2xx 成功狀態碼 | 用于斷點續傳 / 分片下載,服務器僅返回請求資源的部分內容,響應頭含 Content-Range 說明范圍 |
301 | Moved Permanently | 3xx 重定向狀態碼 | 資源永久遷移至新 URL,后續請求需直接訪問新地址,搜索引擎會轉移舊 URL 權重 |
302 | Found | 3xx 重定向狀態碼 | 資源臨時遷移至新 URL,未來可能恢復原地址,搜索引擎不轉移舊 URL 權重,部分客戶端可能變更請求方法 |
304 | Not Modified | 3xx 重定向狀態碼 | 基于緩存機制,資源未修改,客戶端可直接使用本地緩存,減少網絡傳輸和服務器負載 |
307 | Temporary Redirect | 3xx 重定向狀態碼 | 類似 302,但嚴格要求客戶端重定向時保持原請求方法,避免 POST 變 GET 等問題 |
308 | Permanent Redirect | 3xx 重定向狀態碼 | 類似 301,但嚴格要求客戶端重定向時保持原請求方法,適用于需永久跳轉且保持方法的場景 |
400 | Bad Request | 4xx 客戶端錯誤狀態碼 | 服務器無法理解請求,因請求存在語法錯誤、參數缺失 / 格式錯誤等,需客戶端修正后重試 |
401 | Unauthorized | 4xx 客戶端錯誤狀態碼 | 請求需身份驗證,但客戶端未提供有效憑證(如 Token 過期、未登錄),需完成驗證后再請求 |
403 | Forbidden | 4xx 客戶端錯誤狀態碼 | 客戶端已通過身份驗證,但權限不足無法訪問資源,提升權限后才可正常請求 |
404 | Not Found | 4xx 客戶端錯誤狀態碼 | 客戶端請求的資源在服務器不存在,可能因 URL 錯誤、資源被刪或路由配置問題 |
405 | Method Not Allowed | 4xx 客戶端錯誤狀態碼 | 客戶端使用的 HTTP 方法(如 PUT)在當前 URL 不被允許,響應頭 Allow 字段會列出支持的方法 |
406 | Not Acceptable | 4xx 客戶端錯誤狀態碼 | 服務器無法返回客戶端通過 Accept 字段指定的內容類型(如僅支持 JSON 卻要求 XML) |
408 | Request Timeout | 4xx 客戶端錯誤狀態碼 | 服務器在規定時間內未收到客戶端的完整請求(含請求頭和請求體) |
500 | Internal Server Error | 5xx 服務器錯誤狀態碼 | 服務器在處理請求時發生未知的內部錯誤(如代碼邏輯 bug、數據庫連接失敗等),無法完成請求處理,需開發者排查服務器端問題 |
502 | Bad Gateway | 5xx 服務器錯誤狀態碼 | 作為網關 / 代理的服務器,從上游服務器(如后端業務服務器)接收了無效響應,常見于分布式系統中上游服務故障 |
503 | Service Unavailable | 5xx 服務器錯誤狀態碼 | 服務器當前無法處理請求(如服務器過載、維護中),通常是臨時狀態,響應頭可能含 Retry-After 告知重試時間 |
504 | Gateway Timeout | 5xx 服務器錯誤狀態碼 | 作為網關 / 代理的服務器,等待上游服務器響應超時,可能因上游服務器處理緩慢或故障導致 |