HTTP 狀態碼列表

面向開發者的 HTTP 狀態碼(1xx-5xx)完整列表,包含含義、常見原因和解決方法。內建查詢工具——輸入程式碼即可立即檢視詳情。

HTTP 狀態碼對照表
程式碼 名稱 含義 常見原因
1xx — 資訊性響應
100 Continue (Continue) 表示伺服器已收到請求的初始部分,客戶端應繼續傳送其餘內容。 當客戶端在傳送較大的請求體之前傳送 Expect: 100-continue 請求頭時返回。
101 Switching Protocols (Switching Protocols) 表示伺服器接受 Upgrade 請求頭的要求,正在切換到另一種協議。 建立 WebSocket 連線時常見的正常響應。
102 Processing (Processing) 表示伺服器已接受請求但仍在處理中,尚無響應可返回(WebDAV)。 用於在長時間執行的 WebDAV 操作中避免超時。
103 Early Hints (Early Hints) 在最終響應之前傳送 Link 等預備響應頭,讓瀏覽器可以預載入資源。 由 CDN 或反向代理新增,用於加速 CSS/JS 的預載入。
2xx — 成功
200 OK (OK) 最常見的成功響應,表示請求已被成功處理。
201 Created (Created) 表示請求導致新資源被建立。 由通過 POST 建立資源的 API 返回,通常包含指向新資源的 Location 響應頭。
202 Accepted (Accepted) 表示請求已被接受,但處理尚未完成(非同步處理)。 用於僅將任務加入佇列的非同步 API,或批處理接收端點。
204 No Content (No Content) 表示請求成功,但沒有內容可返回。 常見於 DELETE 成功後,或 API 設計中省略響應體的 PUT 更新。
206 Partial Content (Partial Content) 表示根據客戶端的 Range 請求頭,只返回了資源的一部分。 影片拖動播放或斷點續傳下載時的正常響應。
3xx — 重定向
301 Moved Permanently (Moved Permanently) 表示資源已永久移動到新的 URL;搜尋引擎會將排名訊號轉移到新 URL。 用於 URL 結構變更或域名遷移後重定向舊 URL。
302 Found (Found) 表示資源暫時位於另一個 URL。永久性移動應改用 301。 常用於維護期間的臨時路由,或登入後的重定向。
303 See Other (See Other) 表示應使用 GET 方法從另一個 URL 獲取結果(Post-Redirect-Get 模式)。 用於表單提交(POST)之後,以避免瀏覽器的重複提交提示。
304 Not Modified (Not Modified) 表示快取的資源未發生變化,因此不會重新發送響應體。 在快取仍然有效時,針對使用 If-None-Match / If-Modified-Since 的條件請求返回。
307 Temporary Redirect (Temporary Redirect) 一種臨時重定向,與 302 不同,重新發送時會保留原始的方法和請求體。 用於需要重定向 POST/PUT 請求同時保留請求體的 API 設計。
308 Permanent Redirect (Permanent Redirect) 一種永久重定向,與 301 不同,重新發送時會保留原始的方法和請求體。 用於需要永久遷移同時保留請求方法的 API 版本遷移。
4xx — 客戶端錯誤
400 Bad Request (Bad Request) 表示請求的語法或引數格式有誤,伺服器無法理解。 通常由 JSON 語法錯誤、缺少必需引數或型別不匹配引起。
401 Unauthorized (Unauthorized) 表示缺少或提供了無效的身份驗證憑據(儘管名稱如此,實際含義是「未認證」)。 常見原因包括令牌過期、缺少 Authorization 請求頭或 API 金鑰錯誤。
402 Payment Required (Payment Required) 保留供未來使用,有時用於表示需要付款。 一些 API 會借用此狀態碼來表示超出使用限額或計費方案已過期。
403 Forbidden (Forbidden) 表示伺服器理解請求,但拒絕授權執行該請求。 常見原因包括許可權不足、IP 限制、違反 CORS 策略或檔案許可權配置錯誤。
404 Not Found (Not Found) 表示未能找到請求的資源。 通常由未註冊的路由、URL 拼寫錯誤或訪問已被刪除的資源引起。
405 Method Not Allowed (Method Not Allowed) 表示資源存在,但不允許使用指定的 HTTP 方法訪問它。 常見於向僅支援 GET 的端點發送 POST 請求,或類似的方法不匹配情況。
406 Not Acceptable (Not Acceptable) 表示伺服器無法生成符合客戶端 Accept 請求頭要求的響應。 例如客戶端請求 Accept: application/xml,而 API 只能返回 JSON 時發生。
408 Request Timeout (Request Timeout) 表示伺服器等待客戶端完成請求時超時。 常由網路連線緩慢、上傳檔案較大或客戶端在請求中途卡住引起。
409 Conflict (Conflict) 表示請求與資源的當前狀態存在衝突。 常見於併發編輯時的樂觀鎖衝突,或嘗試建立重複資源。
410 Gone (Gone) 表示資源已被永久移除且不會再恢復(比 404 更強烈的訊號)。 用於明確告知搜尋引擎內容已被有意刪除並下線。
413 Payload Too Large (Payload Too Large) 表示請求體的大小超過了伺服器願意接受的限制。 通常由超出檔案上傳大小限制,或 Nginx/PHP 中請求體大小設定不足引起。
414 URI Too Long (URI Too Long) 表示請求的 URI 長度超過了伺服器願意處理的限制。 常見於將大量資料塞入 GET 查詢引數中的情況。
415 Unsupported Media Type (Unsupported Media Type) 表示伺服器不支援請求體所使用的媒體型別。 常見於向 JSON API 傳送 Content-Type: text/plain,或類似的請求頭配置錯誤。
422 Unprocessable Entity (Unprocessable Entity) 表示請求語法正確,但語義驗證失敗。 常用於報告表單驗證錯誤,例如缺少必填欄位或格式不正確。
425 Too Early (Too Early) 表示伺服器拒絕處理可能因早期資料風險而被重放的請求。 可作為針對使用 TLS 1.3 0-RTT 資料的重放攻擊的防禦手段而返回。
429 Too Many Requests (Too Many Requests) 表示客戶端在給定時間視窗內傳送了過多請求(速率限制)。 由超出 API 速率限制引起;Retry-After 響應頭通常會指示重試前需等待的時間。
451 Unavailable For Legal Reasons (Unavailable For Legal Reasons) 表示內容因法律要求(如法院命令)而無法提供。 當內容提供方因版權申訴或特定國家/地區的法律法規而遮蔽訪問時返回。
5xx — 伺服器錯誤
500 Internal Server Error (Internal Server Error) 表示伺服器發生了意外錯誤,無法處理該請求。 原因多種多樣:應用程式中未處理的異常、配置錯誤、資料庫連線失敗等等。
501 Not Implemented (Not Implemented) 表示伺服器不支援完成該請求所需的功能。 常見於向較舊的伺服器實現傳送尚未實現的 HTTP 方法(如 PATCH)時發生。
502 Bad Gateway (Bad Gateway) 表示代理或閘道器從上游伺服器收到了無效的響應。 通常由上游應用伺服器宕機或崩潰引起。
503 Service Unavailable (Service Unavailable) 表示伺服器暫時過載或正在維護,無法處理請求。 主要由高負載下的資源耗盡,或計劃中的維護視窗引起。
504 Gateway Timeout (Gateway Timeout) 表示代理或閘道器未能及時收到上游伺服器的響應。 常由後端處理耗時過長、網路延遲或上游伺服器掛起引起。
505 HTTP Version Not Supported (HTTP Version Not Supported) 表示伺服器不支援請求中使用的 HTTP 版本。 常見於舊客戶端或配置錯誤的代理使用了非預期的 HTTP 版本進行通訊時發生。
507 Insufficient Storage (Insufficient Storage) 表示伺服器沒有足夠的儲存空間來完成請求(WebDAV)。 當檔案儲存操作因磁碟空間不足而失敗時返回。
508 Loop Detected (Loop Detected) 表示伺服器在處理請求時檢測到了無限迴圈(WebDAV)。 常見於 WebDAV 繫結配置中存在迴圈引用的情況。
511 Network Authentication Required (Network Authentication Required) 表示客戶端需要進行身份驗證才能獲得網路訪問許可權。 用於重定向到強制門戶登入頁面,例如公共 Wi-Fi 場景。

使用提示

  • 404 和 410 看起來相似,但 410 明確表示內容是被有意刪除且不會再恢復的。對於沒有替代內容的頁面,使用 410 可以向搜尋引擎發出更清晰的訊號。
  • 301 與 308、302 與 307 分別共享「永久 vs 臨時」的區別,但 308 和 307 在重新發送時會保留原始的 POST 請求體,這一點與 301 和 302 不同。
  • 收到 429 Too Many Requests 時,請檢查 Retry-After 響應頭,並等待相應時間後再重試——強行持續請求可能導致完全被封禁。
  • 5xx 錯誤表示伺服器端出現了問題,而不是你的請求本身有誤——在排查客戶端程式碼之前,應先檢查伺服器日誌和執行狀態。
  • 瀏覽器開發者工具的「網路」(Network)面板會為每個請求的狀態碼標註顏色。結合本表使用可以大幅提升除錯效率。

常見問題

兩者都表示未找到資源,但 404 是一般性的「未找到」,可能只是暫時性的;而 410 則明確表示該資源已被永久移除,且不會再恢復。對於有意刪除的內容,使用 410 可以為 SEO 提供更清晰的訊號。

301(永久)重定向會將舊 URL 幾乎所有的排名訊號轉移到新 URL。302(臨時)重定向則告訴搜尋引擎繼續將舊 URL 視為規範地址,因此永久性的遷移應始終使用 301。

401 Unauthorized 實際上的含義是「未通過身份驗證」——客戶端尚未證明自己的身份。403 Forbidden 則表示客戶端已通過身份驗證,但沒有相應的許可權。儘管名稱容易引起誤解,401 關乎「認證」,而 403 關乎「授權」。

502 表示反向代理或負載均衡器從後端應用伺服器收到了無效的響應。首先應檢查應用伺服器程序是否正在執行、有沒有崩潰。

可以使用瀏覽器開發者工具的「網路」(Network)面板、curl 的 -i 引數,或將程式碼輸入本頁面的查詢工具來檢視其含義。
ツールくん

閒話 ― HTTP 狀態碼簡史

HTTP 狀態碼體系最早在 1996 年釋出的 HTTP/1.0 規範 RFC 1945 中被標準化,隨後 1999 年釋出的 HTTP/1.1(RFC 2616)確立了我們今天所使用的大部分程式碼體系,包括 4xx 和 5xx 系列,此後又經過 RFC 7231(2014 年)和 RFC 9110(2022 年)的延續和更新。也就是說,我們每天在瀏覽器控制台裡看到的這些三位數字,其實是一套歷經近三十年不斷打磨、逐步沉澱下來的協議約定。

這套體系裡也藏著不少有趣的小插曲。最廣為人知的莫過於 418 I'm a teapot——它出自 1998 年愚人節的一份 RFC 文件,其中虛構了一套「超文本咖啡壺控制協議」(HTCPCP):如果你讓一個茶壺去煮咖啡,它自然只能返回這個哭笑不得的狀態碼。這個玩笑後來被不少框架和開發者社群當作彩蛋保留了下來,反倒成了 HTTP 狀態碼裡最容易被記住的一個。

「用首位數字表示大類」這一設計理念看似簡單,卻影響深遠——1xx 表示資訊性響應、2xx 表示成功、3xx 表示重定向、4xx 表示客戶端錯誤、5xx 表示伺服器錯誤,這種一目瞭然的分類方式近三十年來基本沒有改變,據說也啟發了後來 SMTP、FTP 等協議設計各自的返回碼體系。有趣的是,這套體系仍在持續生長:451 Unavailable For Legal Reasons 就是相對較新的成員,於 2015 年在 RFC 7725 中才被正式標準化,而數字 451 是刻意選定的,用以致敬雷·布拉德伯裡(Ray Bradbury)那部以審查制度為主題的反烏托邦小說《華氏 451 度》(Fahrenheit 451)——一個技術規範裡罕見的文學彩蛋。