HTTP 状态码汇总(常见)
Category(分类): NET Protocol Status: 未知
本文保留原文“7 种常见状态码”的入门顺序,并结合 RFC 9110 和 IANA 注册表补充现代 HTTP 语义、缓存、重定向、认证和网关场景。
原文 PDF 资料:
一、什么是 HTTP 状态码
HTTP 状态码是服务器、代理或网关在响应中返回的三位数字,用于表达当前请求的处理结果。状态码不能单独代表所有业务结果,还需要结合请求方法、响应首部、响应体以及实际处理日志判断。
状态码分为五类:
- 1xx(100–199):信息响应,表示处理仍在继续;
- 2xx(200–299):成功响应;
- 3xx(300–399):重定向或缓存相关响应;
- 4xx(400–499):当前服务器无法满足请求,通常涉及请求格式、认证、权限、资源状态或限流;
- 5xx(500–599):服务器、代理或网关无法完成看起来有效的请求。
“4xx 是客户端问题、5xx 是服务器问题”只能作为排查起点,不能绝对化。例如 CDN、反向代理和网关也可能返回 4xx/5xx。
二、7 种常见状态码速查
| 状态码 | 常见含义 | 典型场景 |
|---|---|---|
200 OK | 请求成功 | GET 获取资源、POST 返回处理结果 |
301 Moved Permanently | 永久重定向 | 域名迁移、HTTP 升级 HTTPS、URL 规范化 |
302 Found | 临时重定向 | 临时跳转、登录后跳转 |
304 Not Modified | 缓存未变化 | 条件 GET/HEAD 命中协商缓存 |
403 Forbidden | 服务器拒绝提供服务 | 权限不足、访问策略禁止、隐藏资源存在性 |
404 Not Found | 没有找到目标资源 | URL 错误、资源不存在、故意隐藏资源 |
500 Internal Server Error | 服务器内部异常 | 未处理异常、程序错误、配置或依赖故障 |
三、状态码 200:OK
200 OK 表示请求成功,但“成功”的具体含义由 HTTP 方法决定:
- GET 通常返回目标资源的当前表示;
- HEAD 返回类似 GET 的响应首部,但不能包含响应体;
- POST 的响应可以返回处理结果、创建结果或其他资源表示;
- PUT、PATCH、DELETE 的响应内容由接口语义决定。
因此,不能简单把 200 解释成“服务器找到了客户端请求的内容并返回了内容”。例如一个成功的 HEAD 请求可以返回 200,但没有响应体;成功的 DELETE 也可能返回 200、202 或 204。

示例:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 18
{"ok":true}
200 只说明 HTTP 层请求成功,不代表业务操作一定符合用户预期。业务接口还应在响应体中提供明确的业务状态和错误信息。
四、状态码 301:永久重定向
301 Moved Permanently 表示目标资源已经永久移动到 Location 指定的 URI:
HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/new-path

浏览器或其他用户代理收到 301 后,通常会根据 Location 发起后续请求。严格来说,服务器返回重定向响应,后续“跳转”由客户端或用户代理执行,并不是服务器直接替客户端打开另一个页面。
常见场景:
- HTTP 网站迁移到 HTTPS;
- 域名迁移;
- URL 结构永久调整;
- 统一尾部斜杠或大小写形式。
301 的注意事项
- 301 表示永久语义,客户端、浏览器、搜索引擎和缓存可能长期记住它;
- 是否缓存、缓存多久还取决于
Cache-Control、Expires等规则,不能简单说浏览器一定永久缓存; - 历史客户端可能把 POST 重定向后的请求改成 GET;如果必须保持原方法和请求体,应考虑
308 Permanent Redirect; - 配置错误的 301 可能形成重定向循环。
五、状态码 302:临时重定向
302 Found 表示当前请求暂时需要到另一个 URI 获取结果:
HTTP/1.1 302 Found
Location: https://www.example.com/login

302 适合临时跳转,例如:
- 未登录用户暂时跳转到登录页;
- 临时维护页;
- 活动入口临时调整。
与 301 相比,客户端未来通常仍应使用原始 URI。实际客户端对 POST 的处理存在历史兼容差异,可能将后续请求改为 GET。如果需要明确保留方法和请求体:
- 临时重定向使用
307 Temporary Redirect; - 永久重定向使用
308 Permanent Redirect。
301、302、307、308 对比
| 状态码 | 重定向性质 | 是否要求保留原方法和请求体 |
|---|---|---|
| 301 | 永久 | 历史客户端可能改 POST 为 GET |
| 302 | 临时 | 历史客户端可能改 POST 为 GET |
| 307 | 临时 | 要求保留 |
| 308 | 永久 | 要求保留 |
六、状态码 304:Not Modified
304 Not Modified 用于条件 GET 或 HEAD。客户端先前已经缓存过资源,再带上验证首部请求:
GET /app.js HTTP/1.1
Host: example.com
If-None-Match: "abc123"
如果服务端判断资源没有变化,则返回:
HTTP/1.1 304 Not Modified
ETag: "abc123"
Cache-Control: max-age=3600

304 的含义不是“服务器重新把资源成功返回了”,而是告诉客户端:之前缓存的表示仍然可以使用。304 通常不包含响应体,客户端将本地缓存和本次响应首部合并后继续使用缓存内容。
常见验证字段:
If-None-Match对应服务端的ETag;If-Modified-Since对应服务端的Last-Modified。
如果资源已经变化,服务端通常返回 200 OK 和新的内容,而不是 304。304 主要用于 GET/HEAD,不应当当作所有请求的通用“缓存成功”状态。
七、状态码 403:Forbidden
403 Forbidden 表示服务器理解请求,但拒绝提供服务。常见原因包括:
- 当前用户没有权限;
- IP、地区、设备或来源被访问策略禁止;
- 资源受到法律、组织或安全策略限制;
- 服务端不希望透露目标资源是否存在。

403 不一定表示“服务器已经确认了用户身份”,也不一定只是 IP 被封。服务器可以对未认证用户返回 401,也可以在不希望泄露资源存在性时返回 403 或 404。
403 与 401 的常见区别:
401 Unauthorized:缺少有效认证凭据,通常需要认证,并应包含WWW-Authenticate;403 Forbidden:服务器理解请求,但拒绝执行,即使重新发送相同请求也不一定能解决。
403 响应不应泄露过多内部权限规则。API 可以在响应体中返回稳定的错误标识,但不要暴露敏感路径、内部 ACL 或数据库信息。
八、状态码 404:Not Found
404 Not Found 表示服务器没有找到目标资源,或者不愿透露该资源是否存在:

常见原因包括:
- URL 拼写错误;
- 路由不存在;
- 资源 ID 不存在;
- 资源已经删除;
- 反向代理转发路径错误;
- 服务端故意用 404 隐藏受保护资源。
404 不一定意味着服务器宕机,也不一定意味着域名无法访问。需要结合响应来自源站还是代理、请求路径、路由配置和服务端日志判断。
与 410 的区别通常是:
404:当前没有找到,未来是否存在不确定;410 Gone:资源已经不存在,并且这种状态很可能是永久性的。
API 的 404 响应最好返回稳定的 JSON 错误格式,例如:
HTTP/1.1 404 Not Found
Content-Type: application/problem+json
{
"type": "https://example.com/problems/not-found",
"title": "Resource not found",
"status": 404
}
九、状态码 500:Internal Server Error
500 Internal Server Error 表示服务端遇到未预期的内部错误,无法完成请求:

500 可能由以下原因造成:
- 未处理的程序异常;
- 数据库或缓存依赖故障;
- 配置错误;
- 资源耗尽;
- 模板、序列化或反序列化失败;
- 上游服务返回无法处理的数据。
500 是对客户端的通用错误表达,不应把堆栈、数据库地址、密钥或内部文件路径直接返回给用户。服务端应在日志和链路追踪中记录详细异常,并向客户端返回安全、稳定的错误结构。
500 与其他 5xx 的区别
500:当前服务器自身发生未预期内部错误;502 Bad Gateway:网关或代理从上游收到无效响应;503 Service Unavailable:服务暂时无法处理请求,常见于过载、维护或依赖不可用;504 Gateway Timeout:网关等待上游响应超时;501 Not Implemented:服务器不支持完成请求所需的功能。
十、其他常见状态码
1xx 信息响应
100 Continue:服务端暂未因请求首部拒绝请求,客户端可以继续发送请求体;101 Switching Protocols:HTTP/1.1 协议升级,例如经典 WebSocket 握手;103 Early Hints:最终响应前的提示,可配合Link进行预加载或预连接。
2xx 成功响应
201 Created:请求成功并创建资源,通常可以配合Location;202 Accepted:已接受但尚未完成,不保证最终处理成功;203 Non-Authoritative Information:响应被转换代理修改;204 No Content:成功但无响应体;205 Reset Content:要求用户代理重置文档视图;206 Partial Content:满足 Range 请求;207 Multi-Status:WebDAV 多资源状态;422 Unprocessable Content:语法正确但语义无法处理,常见于 API 校验失败。
3xx 重定向和缓存
300 Multiple Choices:存在多个可选表示;303 See Other:使用 GET 访问另一个 URI;305 Use Proxy:历史状态码,已废弃;306 Unused:保留但未使用;307 Temporary Redirect:临时重定向并保留方法;308 Permanent Redirect:永久重定向并保留方法。
4xx 请求错误
400 Bad Request:请求语法、首部或 framing 无效;405 Method Not Allowed:资源不支持当前方法,响应应包含Allow;406 Not Acceptable:内容协商无法满足客户端偏好;407 Proxy Authentication Required:需要代理认证;408 Request Timeout:服务端等待完整请求超时;409 Conflict:请求与资源当前状态冲突;410 Gone:资源永久或很可能永久不可用;411 Length Required:服务端要求Content-Length;412 Precondition Failed:条件请求首部未满足;413 Content Too Large:请求内容过大,旧称 Payload Too Large;414 URI Too Long:请求目标 URI 过长;415 Unsupported Media Type:不支持请求内容类型;416 Range Not Satisfiable:Range 无法满足;417 Expectation Failed:无法满足Expect;418 Unused:茶壶是历史玩笑,当前注册表标记为未使用;421 Misdirected Request:请求到达了无法为目标 URI 提供权威响应的服务器;425 Too Early:拒绝可能被重放的 TLS 早期数据;428 Precondition Required:要求使用条件请求,避免丢失更新;429 Too Many Requests:触发限流;431 Request Header Fields Too Large:请求首部过大;451 Unavailable For Legal Reasons:因法律原因无法提供资源。
5xx 服务端、网关错误
501 Not Implemented:服务器不支持必要功能;502 Bad Gateway:网关从上游得到无效响应;503 Service Unavailable:服务暂时不可用,可配合Retry-After;504 Gateway Timeout:网关等待上游超时;505 HTTP Version Not Supported:不支持请求中的 HTTP 版本;507 Insufficient Storage:WebDAV 无法存储完成请求所需的表示;508 Loop Detected:处理请求时检测到循环;511 Network Authentication Required:需要完成网络接入认证,例如强制门户认证。
十一、状态码排查建议
遇到状态码时,可以按以下顺序排查:
- 查看请求方法、URL、请求体和关键请求首部;
- 查看
Location、Allow、WWW-Authenticate、Retry-After、Content-Range、ETag等响应首部; - 确认响应是源服务器、反向代理、CDN 还是网关生成的;
- 检查认证、授权、路由、缓存、限流和上游依赖;
- 对照服务端日志和链路追踪,不要只看浏览器错误页面;
- 对请求重试保持谨慎,GET 等幂等请求通常更适合自动重试,POST 是否可重试要结合幂等键和业务语义;
- 不要把 200 当成业务一定成功,也不要把 500 当成唯一的程序错误分类。