HTTP 常见状态码有哪些?
HTTP 状态码(Status Code)是服务器用来告诉客户端(浏览器)当前请求处理情况的 3 位数字代码。
通常分为 5 大类,最常见的如下:
1xx:信息性状态码 (Informational)
表示请求已被接收,需要继续处理。这类状态码平时在浏览器中很少直接看到。
- 100 Continue:客户端应当继续发送请求。通常在发送大数据(如上传文件)前,客户端先发一个头信息询问服务器是否接收,服务器返回 100 后客户端再发数据。
- 101 Switching Protocols:协议切换。常见于 WebSocket 连接建立时,从 HTTP 协议升级为 WebSocket 协议。
2xx:成功状态码 (Success)
表示请求已成功被服务器接收、理解、并接受。
- 200 OK:最常见。请求成功,服务器已返回请求的数据。
- 201 Created:请求成功并且服务器创建了新的资源。通常用于 POST 请求(如注册用户、发布文章)。
- 204 No Content:请求成功,但响应报文不包含实体的主体部分。常见于 DELETE 操作(删除成功,不需要返回数据)或 OPTIONS 请求。
- 206 Partial Content:客户端进行了范围请求(Range Request),服务器成功执行了这部分 GET 请求。视频播放、断点续传时常见。
3xx:重定向状态码 (Redirection)
表示需要客户端采取进一步的操作才能完成请求。
- 301 Moved Permanently:永久重定向。请求的资源已被永久移动到新 URI。搜索引擎会更新索引到新地址。(例如网站更换域名)。
- 302 Found:临时重定向。资源只是暂时移动。搜索引擎不会更新索引。(例如未登录用户访问个人中心被重定向到登录页)。
- 304 Not Modified:资源未修改。这是一个非常重要的状态码,用于浏览器缓存。客户端发送请求时带上了缓存标识,服务器告诉客户端:“你本地的缓存是最新的,直接用吧,我不传数据给你了”。
- 307 / 308:分别是 302 和 301 的严格版,保证重定向时请求方法(Method)不发生变化(比如 POST 不会变成 GET)。
4xx:客户端错误 (Client Error)
表示客户端看起来可能发生了错误,妨碍了服务器的处理。
- 400 Bad Request:请求报文存在语法错误。通常是参数格式不对、缺少必填参数等。
- 401 Unauthorized:未授权。表示发送的请求需要有通过 HTTP 认证的认证信息(比如 Token 过期、未登录)。
- 403 Forbidden:禁止访问。服务器理解请求,但是拒绝执行。通常是因为权限不足(比如普通用户想访问管理员页面),与 401 不同的是,这里即使登录了也无法访问。
- 404 Not Found:未找到。服务器上找不到请求的资源。可能是 URL 输错了,或者资源被删除了。
- 405 Method Not Allowed:请求方法不被允许。例如接口只支持 POST,你却用了 GET。
- 429 Too Many Requests:请求过多。通常触发了服务器的限流机制。
5xx:服务器错误 (Server Error)
表示服务器在处理请求的过程中发生了错误。
- 500 Internal Server Error:服务器内部错误。这是一个通用的错误码,通常意味着后端代码抛出了异常(Bug),或者数据库挂了。
- 502 Bad Gateway:网关错误。作为网关或代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。常见场景:Nginx 作为反向代理,后端的应用服务(如 Java/PHP/Python)挂了或没启动。
- 503 Service Unavailable:服务不可用。服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
- 504 Gateway Timeout:网关超时。网关作为代理,但是上游服务器(后端应用)处理时间过长,导致超时。常见场景:后端程序执行了耗时的数据库查询,导致 Nginx 等不到结果。
总结速记口诀
- 2xx:成功(Success) -> "操作没问题"
- 3xx:重定向(Redirection) -> "去别处看看" 或 "用缓存吧"
- 4xx:客户端错(Client Error) -> "是你(前端/用户)的问题"
- 5xx:服务端错(Server Error) -> "是我(后端/服务器)的问题"