HTTP 状态码 — 完整列表、含义与示例
从 100 到 511 的全部官方 HTTP 状态码,以及 nginx、Cloudflare 和 AWS 状态码,附各自的使用场景。
1xx 信息响应
100Continue
临时响应:服务器已收到请求头,客户端应继续发送请求体。
当客户端在上传大型请求体前带上“Expect: 100-continue”时,由服务器自动发送,避免客户端在会被拒绝的请求上浪费带宽。
不要在应用代码中把它作为最终状态发送;它从来不是对请求的最终响应,只是真正响应之前的一步。
不适用
PUT /upload HTTP/1.1 Content-Length: 104857600 Expect: 100-continue HTTP/1.1 100 Continue
101Switching Protocols
服务器同意将连接切换到 Upgrade 请求头中指定的协议。
WebSocket 连接(Upgrade: websocket)的握手响应,以及早期 HTTP/1.1 升级到 h2c 的场景。
HTTP/2 和 HTTP/3 不使用它;基于 HTTP/2 的 WebSocket 改用扩展 CONNECT 方法(RFC 8441)。
不适用
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
102Processing已弃用
临时响应,告诉客户端服务器仍在处理一个耗时较长的 WebDAV 请求,不要超时。
WebDAV。已在 RFC 4918 中从 WebDAV 移除,但仍保留在 IANA 注册表中。
仅用于处理缓慢递归操作(如深层 COPY 或 MOVE)的旧版 WebDAV 服务器。
新 API 处理长时间任务时,应返回 202 Accepted 并附带状态查询 URL。
不适用
HTTP/1.1 102 Processing
103Early Hints
携带 Link 请求头的临时响应,让浏览器在服务器仍在准备最终响应时就开始预加载或预连接。
当 HTML 需要时间生成(服务端渲染、数据库查询),且你知道页面需要哪些 CSS、字体或源站时。Chromium 系浏览器和 Firefox 会处理 103 响应中的 preload 和 preconnect 提示;Safari 只处理 preconnect。
不要在其中放入只应作用于最终响应的头部,例如 Set-Cookie;浏览器会忽略 103 中的大多数头部。
不适用
HTTP/1.1 103 Early Hints Link: </style.css>; rel=preload; as=style Link: <https://cdn.example.com>; rel=preconnect HTTP/1.1 200 OK Content-Type: text/html
104Upload Resumption Supported
临时响应,告诉客户端已开始的上传可以稍后续传,以及续传位置。
IETF 可续传上传草案的 IANA 临时注册;尚未成为正式 RFC。
实验性:实现可续传上传草案的服务器会发送它,并附带指向上传资源的 Location 头部。
在草案正式发布为 RFC 之前不适合普遍使用;大多数客户端和代理都不认识它。
不适用
draft-ietf-httpbis-resumable-upload
HTTP/1.1 104 Upload Resumption Supported Upload-Draft-Interop-Version: 6 Location: https://example.com/upload/b530ce8ff
2xx 成功
200OK默认可缓存
请求成功。响应体的内容取决于请求方法:GET 返回资源,POST 返回操作结果。
GET 的常规成功响应;POST、PUT、PATCH 或 DELETE 返回描述结果的响应体时也使用它。
不要返回 200 却在响应体中放错误信息(“软错误”)。客户端、监控、缓存和搜索引擎读取的是状态码,而不是你的 JSON。
默认可缓存(可启发式缓存)
HTTP/1.1 200 OK
Content-Type: application/json
{"id": 42, "name": "Ada"}201Created
请求成功,并创建了一个或多个新资源。
在创建了新内容的 POST(或对新 URL 的 PUT)之后使用。附带指向新资源的 Location 头部;响应体通常描述该资源。
没有创建新内容时不要使用,例如更新现有记录(应使用 200 或 204)。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 201 Created
Location: /users/42
Content-Type: application/json
{"id": 42}202Accepted
请求已被接受处理,但处理尚未完成,仍可能失败。
排队或异步任务:视频编码、报表生成、批量导入。返回一个链接,供客户端查询任务状态。
不要把它当作同步任务的“成功”;它明确表示不对结果做任何保证。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 202 Accepted
Location: /jobs/7f3a
Content-Type: application/json
{"status": "queued"}203Non-Authoritative Information默认可缓存
成功,但一个转换代理修改了源服务器的 200 响应。
仅供修改内容的中间层使用,例如压缩图片或重写 HTML 的代理,告诉客户端这不是源服务器的原始响应。
源服务器和 API 不应发送它。
默认可缓存(可启发式缓存)
HTTP/1.1 203 Non-Authoritative Information Content-Type: image/webp
204No Content默认可缓存
成功,并且有意不返回响应体。
成功的 DELETE、不返回更新后资源的 PUT 或 PATCH、表单自动保存,或 CORS 预检响应。
绝不要包含响应体;客户端不会读取它,而且在 HTTP/1.1 上,多余的响应体会破坏同一连接上的下一个响应。如果有内容要返回,请使用 200。
默认可缓存(可启发式缓存)
HTTP/1.1 204 No Content
205Reset Content
成功;客户端应重置文档视图,例如清空刚提交的表单。
数据录入界面:用户提交表单后立即录入下一条记录。
浏览器并未实现重置行为,因此实际上它的效果等同于 204。不得包含响应体。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 205 Reset Content
206Partial Content默认可缓存
服务器只返回客户端通过 Range 请求头所请求的字节范围。
视频和音频拖动进度、断点续传,以及分块并行下载文件的下载管理器。需附带 Content-Range。
除非请求带有你正在响应的 Range 头部,否则不要发送它。如果忽略 Range,请返回 200 和完整响应体。
默认可缓存(可启发式缓存)
GET /video.mp4 HTTP/1.1 Range: bytes=0-1023 HTTP/1.1 206 Partial Content Content-Range: bytes 0-1023/146515 Content-Length: 1024
207Multi-Status
响应体(XML)分别包含多个资源各自的状态。
WebDAV
作用于多个资源的 WebDAV 操作,例如 PROPFIND。一些 JSON API 也借用它作为批量接口的响应。
对于批量 API,许多团队更倾向于使用 200 并逐项返回结果,因为通用客户端会把 207 当作普通的成功。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 207 Multi-Status Content-Type: application/xml; charset="utf-8"
208Already Reported
在 207 响应中使用,表示某个资源已在前面列出,因此不再重复(避免绑定造成循环)。
WebDAV
支持绑定(RFC 5842)的 WebDAV 服务器。
在 WebDAV 之外作为顶层响应没有意义。
仅在明确设置 Cache-Control 或 Expires 时可缓存
<D:status>HTTP/1.1 208 Already Reported</D:status>
226IM Used
服务器完成了 GET 请求,返回的是对当前资源应用的增量(实例操作),而非完整资源。
HTTP 增量编码(A-IM / IM 头部)。很少实际部署。
浏览器不支持;不要在普通 API 中使用。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 226 IM Used IM: vcdiff ETag: "v2"
3xx 重定向
300Multiple Choices默认可缓存
资源有多种表示形式,客户端(或用户)应从中选择一种。
很少见:由客户端驱动的内容协商,例如以多种语言或格式提供文档,并附上各自的链接。
浏览器不会自动选择。要选择语言或格式,服务器驱动的协商或一个带链接的普通页面效果更好。
默认可缓存(可启发式缓存)
HTTP/1.1 300 Multiple Choices Link: </doc.en.html>; rel=alternate; hreflang=en Link: </doc.fr.html>; rel=alternate; hreflang=fr
301Moved Permanently默认可缓存
资源已有新的永久 URL,由 Location 头部给出。
域名迁移、HTTP 转 HTTPS、URL 别名变更、合并重复 URL。搜索引擎会把排名信号转移到新 URL。
浏览器在跟随 301 时可能会把 POST 改为 GET。如果必须保留请求方法(例如迁移了的 API 接口),请使用 308。浏览器会积极缓存 301,部署前请先测试。
默认可缓存(可启发式缓存)
HTTP/1.1 301 Moved Permanently Location: https://www.example.com/new-page
302Found
资源暂时位于另一个 URL;以后仍应使用原 URL。
临时重定向:登录跳转、A/B 测试、维护页面、按地区或语言跳转。
浏览器在跟随 302 时会把 POST 改为 GET(RFC 允许的历史行为)。POST 之后“去查看结果”请使用 303,必须保留请求方法时请使用 307。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 302 Found Location: /login?next=%2Faccount
303See Other
将客户端重定向到另一个 URL,客户端必须用 GET 获取它。
Post/Redirect/Get 模式:表单 POST 之后,返回 303 跳转到结果页,这样刷新页面时不会重复提交表单。
不适用于内容迁移;它并不表示原 URL 已经迁移。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 303 See Other Location: /orders/1234
304Not Modified
对条件 GET 或 HEAD 请求(If-None-Match 或 If-Modified-Since)的响应:客户端的缓存副本仍然有效。
缓存重新验证:本身不会被存储,但会刷新客户端已持有的缓存响应。
当 ETag 或 Last-Modified 日期匹配时,由服务器和 CDN 自动发送,省去传输未变化的响应体。
绝不要发送响应体。不要对非条件请求发送它;客户端没有可复用的内容。
不适用
GET /app.js HTTP/1.1 If-None-Match: "33a64df5" HTTP/1.1 304 Not Modified ETag: "33a64df5" Cache-Control: max-age=3600
305Use Proxy已弃用
已弃用。曾用于告诉客户端通过 Location 中指定的代理重新发送请求。
无。出于安全原因已被弃用,浏览器会忽略它。
不要发送它。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 305 Use Proxy
306(Unused)已弃用
307Temporary Redirect
临时重定向,客户端必须使用相同的方法和请求体重新发送请求。
临时重定向 POST、PUT 或 DELETE 请求(例如 API 接口因维护而临时迁移)。当 HSTS 强制使用 HTTPS 时,浏览器也会显示一个内部 307。
永久迁移请使用 308。如果是“用 GET 去获取结果”,请使用 303。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 307 Temporary Redirect Location: https://api2.example.com/v1/orders
308Permanent Redirect默认可缓存
永久重定向,客户端必须使用相同的方法和请求体重新发送请求。
接收 POST 或 PUT 请求且已永久迁移的 API 接口。搜索引擎会像对待 301 一样对待它。Next.js 和 Vercel 默认使用 308 进行永久重定向。
非常老旧的客户端(Windows 7 及更早版本上的 Internet Explorer)无法识别它;对于普通页面迁移,301 同样适用。
默认可缓存(可启发式缓存)
HTTP/1.1 308 Permanent Redirect Location: https://example.com/api/v2/upload
4xx 客户端错误
400Bad Request
由于客户端错误,服务器不会处理该请求:语法错误、消息帧无效或参数无效。
无法解析的 JSON、缺少必需参数、值的类型错误。请在响应体中说明问题(RFC 9457 problem+json 是不错的格式)。
对于格式正确但不符合业务规则的输入,许多 API 使用 422。认证问题请使用 401 或 403。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
{"title": "Invalid JSON", "detail": "Unexpected token } at position 41"}401Unauthorized
请求缺少有效的身份认证凭据。尽管名称是“Unauthorized”,它实际表示“未认证”。
没有令牌、令牌已过期或密码错误。响应必须包含 WWW-Authenticate 头部,说明如何进行认证。
如果用户已登录但没有权限,请使用 403。不要在没有 WWW-Authenticate 的情况下发送 401。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="api", error="invalid_token"
402Payment Required
保留供将来使用,没有标准语义。
一些 API 用它表示“额度已用完,请升级套餐”或付款失败(Stripe 在银行卡被拒时返回 402)。
不要指望客户端能理解它;请在响应体中说明问题。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 402 Payment Required
Content-Type: application/json
{"error": "card_declined"}403Forbidden
服务器理解了请求,也知道你是谁(或者并不关心),但拒绝执行。
已认证的用户缺少权限、IP 被封禁、目录列表被禁用,或触发了 WAF 规则。重新认证也无济于事。
如果凭据缺失或无效,请使用 401。如果暴露资源的存在本身就是一种泄露,请改为返回 404。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 403 Forbidden
Content-Type: application/json
{"error": "You do not have access to this project"}404Not Found默认可缓存
服务器没有该 URL 的当前表示,或者不愿透露它是否存在。
未知 URL、未追踪删除状态的已删除记录,或对未授权用户隐藏资源。
如果资源曾经存在且已永久删除,410 能明确表达这一点。不要返回一个写着“未找到”的 200 页面(软 404)。
默认可缓存(可启发式缓存)
HTTP/1.1 404 Not Found Content-Type: text/html
405Method Not Allowed默认可缓存
URL 存在,但不支持此 HTTP 方法。
对只读资源发送 DELETE,或对仅支持 GET 的页面发送 POST。响应必须包含列出所支持方法的 Allow 头部。
不要将其用于权限问题(403),也不要用于服务器完全没有实现的方法(501)。
默认可缓存(可启发式缓存)
HTTP/1.1 405 Method Not Allowed Allow: GET, HEAD
406Not Acceptable
服务器无法生成与请求的 Accept、Accept-Language 或 Accept-Encoding 头部相匹配的响应。
只支持 JSON 的 API 收到“Accept: application/xml”且没有备选格式时。
大多数服务器会忽略不匹配的 Accept 头部,直接返回默认格式,这通常更友好。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 406 Not Acceptable
Content-Type: application/json
{"supported": ["application/json"]}407Proxy Authentication Required
与 401 类似,但客户端必须先向中间的代理进行认证。
由正向代理(企业代理)发送,并附带 Proxy-Authenticate 头部。
源服务器绝不应发送它。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 407 Proxy Authentication Required Proxy-Authenticate: Basic realm="corp-proxy"
408Request Timeout
服务器在愿意等待的时间内没有收到完整的请求,即将关闭连接。
服务器在空闲的 keep-alive 连接或上传缓慢时发送。客户端可以在新连接上重试请求。
不适用于后端处理缓慢的情况;那属于网关的 504,或只是响应慢。发送它时请附带“Connection: close”。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 408 Request Timeout Connection: close
409Conflict
请求与资源的当前状态冲突。
创建邮箱已存在的用户、编辑已被他人修改的记录(版本不匹配)、删除非空文件夹。
If-Match / If-Unmodified-Since 条件不满足时请使用 412。校验错误请使用 400 或 422。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error": "Email already registered"}410Gone默认可缓存
资源曾经存在于此,现已永久删除,且没有转发地址。
停产的商品、过期的促销、已注销的账号、已下线的 API 版本。Google 对 404 和 410 的处理几乎相同,不过 410 可能会稍早一点从索引中移除。
如果内容已迁移,请改用 301 重定向。如果不确定是否永久删除,请使用 404。
默认可缓存(可启发式缓存)
HTTP/1.1 410 Gone
411Length Required
服务器要求此请求带有 Content-Length 头部。
拒绝分块上传、需要预先知道请求体大小的服务器。
应用程序很少需要它;通常由 Web 服务器自身发出。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 411 Length Required
412Precondition Failed
请求头中的某个条件(If-Match、If-Unmodified-Since、写操作上的 If-None-Match)计算结果为 false。
乐观并发控制:客户端发送的 If-Match 带有旧的 ETag,说明有人先修改了该资源。
不要将其用于与条件头部无关的业务规则失败(应使用 409 或 422)。
仅在明确设置 Cache-Control 或 Expires 时可缓存
PUT /docs/7 HTTP/1.1 If-Match: "v3" HTTP/1.1 412 Precondition Failed ETag: "v4"
413Content Too Large
请求体超过了服务器愿意处理的大小。在 RFC 9110 之前名为“Payload Too Large”。
超出限制的上传(nginx 的 client_max_body_size、API 的 10 MB 上限)。如果限制是临时的,请附加 Retry-After。
URL 过长请使用 414;头部过大请使用 431。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 413 Content Too Large Connection: close
414URI Too Long默认可缓存
请求目标(URL)超出了服务器愿意解析的长度。
超长的查询字符串,通常是本应使用 POST 的 GET 表单,或不断追加参数的重定向循环。
把大量输入移到请求体中(POST),而不是无限提高限制。
默认可缓存(可启发式缓存)
HTTP/1.1 414 URI Too Long
415Unsupported Media Type
服务器拒绝请求,因为请求体的格式(Content-Type 或 Content-Encoding)不受支持。
只接受 JSON 的接口收到表单数据或 XML,或缺少 Content-Type 头部。可附带 Accept-Post 或 Accept-Patch 说明支持的格式。
不适用于格式正确但内容无效的请求体(应使用 400 或 422)。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 415 Unsupported Media Type Accept-Post: application/json
416Range Not Satisfiable
Range 头部中的字节范围与资源没有任何重叠,例如请求超出文件末尾的字节。
断点续传时文件变小了,或客户端请求超出了文件末尾。需附带 Content-Range: bytes */<length>。
服务器也可以直接忽略无效的 Range,返回 200 和完整响应体,这同样是允许的。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 416 Range Not Satisfiable Content-Range: bytes */47022
417Expectation Failed
服务器无法满足请求中 Expect 头部的要求。
客户端向不支持的服务器或代理发送了“Expect: 100-continue”,或发送了未知的期望值。
收到它的客户端应去掉 Expect 头部后重试。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 417 Expectation Failed
418(Unused)
由于 418 作为“I’m a teapot”玩笑状态码被广泛使用,RFC 9110 将其保留;它在 HTTP 中没有定义含义。
保留。因 1998 年愚人节 RFC 2324(HTCPCP)中的“I’m a teapot(我是一个茶壶)”而闻名。
仅作为彩蛋。一些服务会用它以幽默的方式拒绝某些请求。
不要将其用于真正的错误;它无法被赋予含义,客户端也不知道该如何处理。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 418 I'm a teapot
419Page Expired非官方 · Laravel
当 CSRF 令牌缺失或已过期时,Laravel 会返回它,通常发生在含表单的页面会话超时之后。
由 Laravel 的 CSRF 中间件发送。解决方法:刷新页面、在表单中加入 @csrf,或在 AJAX 请求中发送 X-CSRF-TOKEN 头部。
不是标准状态码;不要在非 Laravel 的 API 中发送它。
不适用
Laravel(不在 IANA 注册表中)
HTTP/1.1 419 unknown status
420Enhance Your Calm非官方 · Twitter(旧版)
旧版 Twitter API 的限流响应,已被标准的 429 取代。
不应再新用。你可能仍会在旧的客户端库中遇到它。Spring 曾将 420 定义为“Method Failure”,现已弃用。
限流请使用 429。
不适用
Twitter API v1(不在 IANA 注册表中)
HTTP/1.1 420 Enhance Your Calm
421Misdirected Request
请求到达了一台无法为该主机名和协议生成响应的服务器。
HTTP/2 连接合并出错:浏览器为同一证书覆盖的另一个主机名复用了连接,但服务器并不提供该主机名的服务。客户端应在新连接上重试。
不适用于单台服务器上普通的未知主机名;这种情况通常返回 404 或交给默认虚拟主机处理。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/2 421
422Unprocessable Content
请求格式正确且格式受支持,但内容未通过校验。在 RFC 4918 中名为“Unprocessable Entity”。
表单和 API 校验错误:邮箱格式不对、结束日期早于开始日期。Rails、Laravel 和 FastAPI 默认使用它。
语法错误(无法解析的 JSON)请使用 400。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 422 Unprocessable Content
Content-Type: application/json
{"errors": {"email": ["is invalid"]}}423Locked
资源已被锁定,请求无法修改它。
WebDAV
WebDAV LOCK 语义。一些 API 用它表示记录正被他人编辑,或账号因多次登录失败而被锁定。
在 WebDAV 之外,通用客户端更容易理解 409。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 423 Locked
424Failed Dependency
该操作失败,因为它所依赖的另一个操作失败了。
WebDAV
在 WebDAV PROPPATCH 或批量请求中,因前面的项目失败而未执行的项目。
不适用于上游服务故障;那应该是 502 或 503。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 424 Failed Dependency
425Too Early
服务器不会处理通过 TLS 1.3 早期数据(0-RTT)发送的请求,因为它可能被重放。
接受 0-RTT、但拒绝早期数据中非幂等请求(POST)的 CDN 和服务器。客户端会在握手完成后重试。
不是通用的“稍后再试”状态码;那种情况请使用 503 并附带 Retry-After。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 425 Too Early
426Upgrade Required
服务器拒绝在当前协议上处理请求,但在升级到 Upgrade 头部中指定的协议后会接受。
要求使用 TLS 或更新的协议,或用普通 HTTP 请求访问了 WebSocket 接口。必须包含 Upgrade 头部。
对于网站的 HTTP 转 HTTPS,常用做法是 301 或 308 重定向加上 HSTS。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 426 Upgrade Required Upgrade: TLS/1.3, HTTP/1.1 Connection: Upgrade
428Precondition Required
服务器要求请求必须是条件请求(If-Match 等),以防止更新丢失。
要求客户端在 PUT、PATCH 或 DELETE 之前,用 If-Match 发送其最后看到的 ETag 的 API。
如果发送了前提条件但未满足,请使用 412;428 用于根本没有发送前提条件的情况。
缓存不得存储
HTTP/1.1 428 Precondition Required
Content-Type: application/json
{"error": "Send If-Match with the current ETag"}429Too Many Requests
客户端在给定时间内发送了过多请求(限流)。
API 限流、登录频率限制、防爬虫。附带 Retry-After,让行为规范的客户端知道何时再来;RateLimit 头部也很有帮助。
如果服务器对所有人都过载,请使用 503。Googlebot 对待 429 与 503 相同,会放慢抓取速度。
缓存不得存储
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json
{"error": "Rate limit exceeded: 100 requests per minute"}431Request Header Fields Too Large
请求头(单个或整体)太大,服务器无法处理。
通常是某个域名下累积了过大的 Cookie,或 Authorization 令牌过长。对用户来说,清除 Cookie 往往就能解决。
URL 过长请使用 414;请求体过大请使用 413。
缓存不得存储
HTTP/1.1 431 Request Header Fields Too Large
440Login Time-out非官方 · Microsoft IIS / Exchange
客户端会话已过期,必须重新登录(Outlook Web Access 及其他 IIS 应用)。
出现在 Exchange/OWA 环境中。
在你自己的应用中,会话过期请使用 401。
不适用
Microsoft IIS(不在 IANA 注册表中)
HTTP/1.1 440 Login Time-out
444No Response非官方 · nginx
nginx 内部状态码:“return 444;”会直接关闭连接,不发送任何响应。
丢弃扫描器的请求、默认 server 块中未知 Host 头部的请求,或恶意客户端的请求。它会出现在 nginx 日志中;客户端看到的是空响应。
客户端永远不会收到 444,因此无需在客户端代码中处理。
不适用
nginx(不在 IANA 注册表中)
server {
listen 80 default_server;
return 444;
}449Retry With非官方 · Microsoft
Microsoft 扩展:客户端执行某个特定操作后应重试该请求。
出现在部分 Microsoft 服务中(Exchange ActiveSync;Azure Cosmos DB 用 449 表示可重试的写入冲突)。
非标准;在你自己的 API 中请使用 409,或 503 加 Retry-After。
不适用
Microsoft IIS(不在 IANA 注册表中)
HTTP/1.1 449 Retry With
450Blocked by Windows Parental Controls非官方 · Microsoft
Windows 家长控制阻止了对该页面的访问。
由启用了家长控制的 Windows 系统生成。
不要从服务器发送它。
不适用
Microsoft(不在 IANA 注册表中)
HTTP/1.1 450 Blocked by Windows Parental Controls
451Unavailable For Legal Reasons默认可缓存
因法律要求而拒绝访问:法院命令、政府审查或出于法律原因的地区限制。
在某个司法管辖区被屏蔽的内容(制裁、与 GDPR 相关的地区屏蔽、下架令)。可用带 rel="blocked-by" 的 Link 头部注明实施屏蔽的一方。
不适用于普通的权限拒绝(403),也不适用于你自行决定删除的内容(410)。
默认可缓存(可启发式缓存)
HTTP/1.1 451 Unavailable For Legal Reasons Link: <https://authority.example/>; rel="blocked-by"
460Client closed connection (AWS ELB)非官方 · AWS Application Load Balancer
当客户端在空闲超时到期前关闭连接时,由 AWS ALB 记录。
出现在 ALB 访问日志中;通常是客户端的超时时间短于目标的处理时间。
不会发送给客户端。
不适用
AWS Elastic Load Balancing(不在 IANA 注册表中)
elb_status_code=460
463Too many IPs in X-Forwarded-For (AWS ELB)非官方 · AWS Application Load Balancer
ALB 收到的 X-Forwarded-For 头部包含超过 30 个 IP 地址。
通常是代理循环不断追加地址所致。
不供应用使用。
不适用
AWS Elastic Load Balancing(不在 IANA 注册表中)
HTTP/1.1 463
494Request Header Too Large非官方 · nginx
nginx 内部状态码,表示请求头超出了 large_client_header_buffers;客户端收到的是 400。
出现在 nginx 日志和 error_page 配置中。
对应的标准状态码是 431。
不适用
nginx(不在 IANA 注册表中)
error_page 494 /header-too-large.html;
495SSL Certificate Error非官方 · nginx
nginx 内部状态码:客户端提供了无效的客户端证书(双向 TLS)。以 400 发送给客户端。
用于 mTLS 失败时的自定义错误页面。
不是实际传输的状态码。
不适用
nginx(不在 IANA 注册表中)
error_page 495 /bad-client-cert.html;
496SSL Certificate Required非官方 · nginx
nginx 内部状态码:要求提供客户端证书,但客户端未提供。以 400 发送给客户端。
启用 ssl_verify_client 时的自定义错误页面。
不是实际传输的状态码。
不适用
nginx(不在 IANA 注册表中)
error_page 496 /client-cert-required.html;
497HTTP Request Sent to HTTPS Port非官方 · nginx
nginx 内部状态码:普通 HTTP 请求到达了要求 TLS 的端口。以 400 发送给客户端。
一个常用技巧是“error_page 497 =301 https://$host$request_uri;”,将此类请求重定向到 HTTPS。
不是实际传输的状态码。
不适用
nginx(不在 IANA 注册表中)
error_page 497 =301 https://$host:$server_port$request_uri;
498Invalid Token非官方 · Esri ArcGIS Server
令牌过期或无效时,ArcGIS 会返回它。
仅在调用 ArcGIS 服务时相关。
在你自己的 API 中,无效令牌请使用 401。
不适用
Esri ArcGIS(不在 IANA 注册表中)
HTTP/1.1 498 Invalid Token
499Client Closed Request非官方 · nginx
当客户端在 nginx 发送响应之前关闭了连接时,nginx 会记录 499。
出现在访问日志中:用户离开了页面、移动客户端超时,或 nginx 前面的负载均衡器超时时间更短。某个接口出现大量 499,通常说明它太慢了。
客户端永远不会收到它。Esri 也用 499 表示“Token Required”。
不适用
nginx(不在 IANA 注册表中)
203.0.113.9 - - [16/Oct/2026:10:12:01 +0000] "GET /report HTTP/1.1" 499 0
5xx 服务器错误
500Internal Server Error
服务器遇到意外情况,无法完成请求。
未处理的异常和程序错误。当没有更具体的 5xx 适用时,它是通用的兜底状态码。
不要将其用于客户端错误(4xx)。在生产环境中不要在响应体中泄露堆栈跟踪;应记录到日志中。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 500 Internal Server Error
Content-Type: application/problem+json
{"title": "Internal Server Error", "traceId": "4bf92f35"}501Not Implemented默认可缓存
服务器不支持完成请求所需的功能,通常是它完全不认识的 HTTP 方法。
使用未知方法的请求(例如对普通 Web 服务器使用 WebDAV 方法),或服务器有意尚未实现的功能。
如果方法已知但不允许用于该 URL,请使用 405。
默认可缓存(可启发式缓存)
HTTP/1.1 501 Not Implemented
502Bad Gateway
网关或代理从上游服务器收到了无效响应。
当应用服务器崩溃、关闭连接或返回乱码时,由反向代理和负载均衡器(nginx、Cloudflare、AWS ALB)发送。
应用代码很少需要发送它,除非是调用其他服务失败的 API 网关。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 502 Bad Gateway Server: nginx
503Service Unavailable
服务器暂时无法处理请求:过载或停机维护。预计是暂时的。
计划内维护、降载、依赖服务中断。请附加 Retry-After。在短时间的 503 期间,搜索引擎会保留页面索引,而 200 维护页面或 404 则不会。
不要让网站连续几天返回 503;如果 URL 一直返回它,Google 最终会将其从索引中移除。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 503 Service Unavailable Retry-After: 3600
504Gateway Timeout
网关或代理没有及时收到上游服务器的响应。
当应用处理时间超过代理超时时间时,由代理和负载均衡器发送(nginx 的 proxy_read_timeout 默认为 60 秒)。
对于耗时长的任务,不要只是提高超时时间;应返回 202 并异步处理。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 504 Gateway Timeout Server: awselb/2.0
505HTTP Version Not Supported
服务器不支持请求所使用的 HTTP 主版本。
服务器收到了它无法支持的协议版本。
很少见;客户端通过 ALPN 和 Alt-Svc 协商 HTTP/2 和 HTTP/3,而不是靠逐个尝试。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 505 HTTP Version Not Supported
506Variant Also Negotiates
服务器配置错误:所选的变体本身也被配置为进行协商,从而形成循环。
透明内容协商(实验性)
仅限实现了 RFC 2295 透明内容协商的服务器。
不适用于应用错误。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 506 Variant Also Negotiates
507Insufficient Storage
服务器无法存储完成请求所需的内容。
WebDAV
磁盘或用户配额已满时的 WebDAV 或文件存储 API。
对于超出大小限制的单个上传,413 更清晰。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 507 Insufficient Storage
508Loop Detected
服务器发现了无限循环(Depth: infinity 的 WebDAV 绑定),因此中止了操作。
WebDAV
WebDAV 服务器。基于 CloudLinux 的共享主机在账号达到资源上限时也会发送 508“Resource Limit Is Reached”,这是非标准用法。
不适用于重定向循环;那是由浏览器自行报告的客户端错误。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 508 Loop Detected
509Bandwidth Limit Exceeded非官方 · Apache bw_mod / cPanel
主机账号已超出带宽配额。
共享主机控制面板。
在你自己的系统中请使用 503 或 429。
不适用
Apache / cPanel(不在 IANA 注册表中)
HTTP/1.1 509 Bandwidth Limit Exceeded
510Not Extended已弃用
请求不符合 HTTP 扩展框架下访问该资源的策略。
在 IANA 注册表中标记为已废弃:RFC 2774 已被移入 Historic(历史)类别。
目前无实际用途;该扩展框架从未被广泛实现。
不要发送它。
仅在明确设置 Cache-Control 或 Expires 时可缓存
HTTP/1.1 510 Not Extended
511Network Authentication Required
客户端必须先认证才能访问网络:即强制门户(Captive Portal)。
酒店、机场和咖啡馆的 Wi-Fi 认证页面,在用户登录或接受条款之前拦截流量。
源服务器绝不能发送它;它只用于拦截流量的网络代理。
缓存不得存储
HTTP/1.1 511 Network Authentication Required Content-Type: text/html <meta http-equiv="refresh" content="0; url=https://login.example.net/">
520Web Server Returned an Unknown Error非官方 · Cloudflare
源站向 Cloudflare 返回了空的、未知的或意外的响应。
检查源站日志:崩溃、连接重置、头部超出 Cloudflare 的限制,或空响应。
只有 Cloudflare 会发送它。
不适用
Cloudflare(不在 IANA 注册表中)
HTTP/2 520 server: cloudflare
521Web Server Is Down非官方 · Cloudflare
Cloudflare 无法连接到源站:连接被拒绝。
源站 Web 服务器已停止,或防火墙拦截了 Cloudflare 的 IP 段。
只有 Cloudflare 会发送它。
不适用
Cloudflare(不在 IANA 注册表中)
HTTP/2 521 server: cloudflare
522Connection Timed Out非官方 · Cloudflare
Cloudflare 与源站建立 TCP 连接时超时。
源站过载、数据包被防火墙丢弃,或 DNS 中的源站 IP 错误。
只有 Cloudflare 会发送它。
不适用
Cloudflare(不在 IANA 注册表中)
HTTP/2 522 server: cloudflare
523Origin Is Unreachable非官方 · Cloudflare
Cloudflare 完全无法访问源站,通常是路由问题或 DNS 记录错误。
检查 DNS A/AAAA 记录是否指向正确且可访问的 IP。
只有 Cloudflare 会发送它。
不适用
Cloudflare(不在 IANA 注册表中)
HTTP/2 523 server: cloudflare
524A Timeout Occurred非官方 · Cloudflare
Cloudflare 已连接到源站,但源站没有在超时时间内(默认 100 秒)发送 HTTP 响应。
耗时长的请求:把工作移到后台任务并轮询,或以流式方式返回进度。
只有 Cloudflare 会发送它。
不适用
Cloudflare(不在 IANA 注册表中)
HTTP/2 524 server: cloudflare
525SSL Handshake Failed非官方 · Cloudflare
Cloudflare 与源站之间的 TLS 握手失败。
在 SSL 模式为 Full 或 Full (strict) 时,源站没有监听 443 端口、没有证书、没有共同的加密套件,或未配置 SNI。
只有 Cloudflare 会发送它。
不适用
Cloudflare(不在 IANA 注册表中)
HTTP/2 525 server: cloudflare
526Invalid SSL Certificate非官方 · Cloudflare
在 Full (strict) 模式下,Cloudflare 无法验证源站证书:证书过期、自签名或主机名不符。
在源站上安装有效证书或 Cloudflare Origin CA 证书。
只有 Cloudflare 会发送它。
不适用
Cloudflare(不在 IANA 注册表中)
HTTP/2 526 server: cloudflare
527Railgun Error非官方 · Cloudflare(已停用)已弃用
Cloudflare 与源站的 Railgun 监听器之间出现连接问题。Cloudflare 已停止提供 Railgun。
仅具历史意义。
只有 Cloudflare 发送过它。
不适用
Cloudflare(不在 IANA 注册表中)
HTTP/1.1 527 Railgun Error
530Origin DNS / 1xxx error非官方 · Cloudflare
与 Cloudflare 1xxx 错误页面一起返回(例如 1016 Origin DNS error);页面上显示的 1xxx 代码才是真正的原因。
查询页面上显示的 1xxx 错误编号。
只有 CDN 和托管服务商会发送它。
不适用
Cloudflare(不在 IANA 注册表中)
HTTP/2 530 server: cloudflare
561Unauthorized (AWS ELB)非官方 · AWS Application Load Balancer
ALB 内置的身份认证(OIDC 或 Cognito)在身份提供商处失败。
检查 ALB 监听器规则的 IdP 配置。
不供应用使用。
不适用
AWS Elastic Load Balancing(不在 IANA 注册表中)
HTTP/1.1 561
598Network Read Timeout Error非官方 · 部分 HTTP 代理
部分代理用它表示代理后端的读取超时。
很少见;你可能会在某些代理产品中看到它。
请使用 504。
不适用
Informal convention(不在 IANA 注册表中)
HTTP/1.1 598
599Network Connect Timeout Error非官方 · 部分 HTTP 代理和客户端
部分代理和客户端库(例如 Tornado 的 HTTP 客户端)用它表示连接超时。
很少见。
代理请使用 504。
不适用
Informal convention(不在 IANA 注册表中)
HTTP/1.1 599
这是在你的浏览器中运行的静态参考,你的搜索内容不会发送到任何地方。 浏览全部免费工具.
发现问题,或者觉得哪里可以更好?每条消息我们都会阅读,并尽快修复。
这份 HTTP 状态码列表涵盖 IANA 注册表中的全部状态码,从 100 Continue 到 511 Network Authentication Required,并说明每个状态码的含义、何时该用、何时不该用、缓存能否存储,以及定义它的 RFC 章节。输入数字、4xx 这样的类别,或“重定向”“限流”这样的词即可筛选,还可以用 #404 或 #503 这样的锚点直接链接到任意状态码。
官方条目遵循 RFC 9110(2022 年),它取代了 RFC 7231,并重新命名了几个状态码:413 现在叫 Content Too Large,422 叫 Unprocessable Content。那些在日志中能看到、却不在注册表里的状态码,例如 nginx 499 或 Cloudflare 522,也一并收录并标注为非官方,同时注明由哪个系统发送。这是一份参考资料,而不是监控工具:它不会请求 URL,也不会检查线上网站返回什么状态码。
使用方法
- 在搜索框中输入状态码(503)、类别(4xx)或关键词(timeout、redirect、cache)。结果随输入实时筛选。
- 用类别按钮只显示 1xx、2xx、3xx、4xx 或 5xx 状态码,取消勾选“包含非官方状态码”可隐藏厂商特有的状态码。
- 点击某个状态码展开详情:含义、何时该用、何时不该用、缓存行为、定义它的 RFC 以及示例响应。
- 使用“复制此状态码的链接”分享直达链接,例如 /tools/http-status-codes#429。
常见问题
401 和 403 有什么区别?
401 Unauthorized 表示请求没有有效的凭据:客户端未登录,或令牌已过期。服务器必须发送 WWW-Authenticate 头,说明如何进行身份验证。403 Forbidden 表示服务器知道客户端是谁(或者不需要知道),但仍然拒绝;重新登录也没用。简而言之,401 是“你是谁?”,403 是“我知道你是谁,但不行。”
永久重定向应该用 301 还是 308?
两者都是永久重定向,在 Google 中都会传递排名信号。区别在于请求方法:跟随 301 时,浏览器可能把 POST 改成 GET,而 308 要求客户端用相同的方法和请求体重新发送。普通的页面迁移用 301 就行;接收 POST 或 PUT 的 API 端点请用 308。临时重定向也有同样的对应关系:302 可能改变方法,307 则不得改变。
nginx 日志中的 499 是什么意思?
499 Client Closed Request 是 nginx 独有的状态码。当客户端在 nginx 发送响应之前关闭了连接时,就会记录这个状态码,所以客户端实际上从未收到 499。偶尔出现 499 是用户离开了页面;如果某个端点出现大量 499,通常说明它太慢,客户端或上游负载均衡器先超时了。
502、503 和 504 有什么区别?
这三个状态码都来自位于另一台服务器前面的服务器。502 Bad Gateway 表示代理从上游应用收到了无效响应或连接被断开。503 Service Unavailable 表示服务器暂时无法处理请求,通常是因为过载或维护,并应附带 Retry-After。504 Gateway Timeout 表示代理等不到上游的响应,放弃了等待。
418 I'm a teapot 是真正的状态码吗?
它最初是 RFC 2324(1998 年)中的一个愚人节玩笑,后来被足够多的软件实现,以至于 RFC 9110 现在把 418 列为“(Unused)”:予以保留,永远不会被赋予实际含义。遇到真实问题时不应发送这个状态码,但把它留作彩蛋是安全的。
哪些状态码默认可以被缓存?
RFC 9110 将 200、203、204、206、300、301、308、404、405、410、414 和 501 列为可启发式缓存,即即使没有 Cache-Control 或 Expires,缓存也可以存储它们。RFC 7725 增加了 451。其他状态码(包括 302 和 307)只有在响应带有明确的新鲜度信息时才会被缓存,而 RFC 6585 规定 428、429、431 和 511 绝不能被存储。
五大类别一览
• 1xx 信息性:最终响应之前的临时响应。你很少需要直接处理它们;实际中重要的是 101(WebSocket 升级)和 103(Early Hints)。
• 2xx 成功:请求成功。普通响应用 200,创建了资源时用 201(附 Location 头),刻意不返回内容时用 204。
• 3xx 重定向:客户端必须到别处获取。永久迁移用 301/308,临时迁移用 302/307,表单 POST 之后用 303,缓存副本仍然有效时用 304。
• 4xx 客户端错误:请求有误,原样重试仍会失败。400 格式错误,401 未认证,403 无权限,404 未找到,409 冲突,422 校验失败,429 请求频率超限。
• 5xx 服务器错误:请求本身可能没问题,但服务器出错了。500 是程序 bug,502/504 是代理到上游的故障,503 是暂时不可用。
在 API 中选择正确的状态码
返回通用客户端能据以采取行动的最具体状态码,把细节放在响应体中。会自动重试的 HTTP 客户端、CDN 或监控系统无需读取你的 JSON 就知道 429 和 503 是什么意思,但它们无法理解一个带着 {"error": true} 的 200。RFC 9457(Problem Details)为错误响应体规定了标准的 JSON 格式。
大多数 JSON API 的实用对应关系:无法解析的输入用 400,格式正确但校验失败的输入用 422,令牌缺失或过期用 401,用户缺少权限用 403,未知 ID 用 404(也可用于隐藏用户无权查看的资源),重复和版本冲突用 409,If-Match 中的 ETag 已过时用 412,频率限制用 429 并附 Retry-After,计划内停机用 503 并附 Retry-After。
不要自创新的状态码。客户端会把未知状态码当作同类别的 x00 处理(未知的 4xx 按 400 处理),所以自定义一个 461,与 400 加一条清晰的错误信息相比毫无优势。
状态码与 SEO
搜索引擎会按字面理解状态码。301 或 308 会把旧 URL 的信号转移到新 URL;302 或 307 则告诉 Google 继续把旧 URL 保留在索引中。404 和 410 都会让页面随时间从索引中移除。显示“未找到”却返回 200 的页面是软 404,Google 会检测到并在 Search Console 中报告。网站维护时,短时间返回 503 并附 Retry-After 可以保住排名,而返回 200 的“我们很快回来”页面则可能在搜索结果中取代你的内容。Googlebot 遇到 429、500 或 503 时也会降低抓取频率。
相关免费工具
- User Agent 解析器 — 查看你自己的 User Agent 和客户端提示,或把任意 UA 字符串解析为浏览器、引擎、操作系统、设备和 CPU。支持批量模式并导出 CSV。
- JSON 格式化 — 格式化、压缩和校验 JSON,解析错误精确到行和列。在浏览器中运行,无需上传。
- Docker Run ⇄ Compose — 把 docker run 命令转换成 docker-compose.yml 服务,或把 Compose 服务转回 docker run 命令。
- 正则表达式测试 — 用示例文本测试正则表达式,实时高亮匹配结果,显示捕获组并预览替换效果。免费,在浏览器中运行。