Web开发:什么是 HTTP 状态码?
一、什么是 HTTP 状态码?

HTTP 状态码是当客户端(如浏览器)向服务器发出请求时,服务器返回的一个三位数字代码。它代表了服务器对请求的处理结果,是客户端判断请求成功与否、以及下一步该如何操作的主要依据。
状态码的第一个数字定义了响应的类别,共有 5 类:
| 分类 | 描述 | 含义 |
|---|---|---|
| 1xx | 信息性状态码 | 请求已被接收,继续处理。 |
| 2xx | 成功状态码 | 请求已成功被服务器接收、理解并接受。 |
| 3xx | 重定向状态码 | 需要客户端采取进一步的操作才能完成请求。 |
| 4xx | 客户端错误状态码 | 请求含有语法错误或无法完成。 |
| 5xx | 服务器端错误状态码 | 服务器在处理一个看似有效的请求时发生错误。 |
二、常见和重要的 HTTP 状态码详解

下面我们按类别列出一些最常见和最重要的状态码。
1xx - 信息性状态码
这类状态码比较少见,通常表示请求已被接受,需要继续处理。
- 100 Continue:客户端应继续发送请求的剩余部分。常用于客户端发送较大数据(如文件上传)前,先询问服务器是否接受。
- 101 Switching Protocols:客户端要求服务器切换协议,服务器已同意切换。例如,从 HTTP 切换到 WebSocket。
2xx - 成功状态码
表示请求已成功处理。
- 200 OK:最常见的成功状态码。表示请求成功,响应报文中包含了请求的资源(如 HTML 页面、图片等)。
- 201 Created:请求成功,并且服务器创建了新的资源(通常在 POST 或 PUT 请求之后)。响应头
Location字段通常会包含新资源的 URL。 - 204 No Content:请求成功,但响应报文中没有实体主体(不返回任何内容)。常见于 DELETE 请求或只需成功执行但无需返回数据的 AJAX 请求。
3xx - 重定向状态码
表示浏览器需要执行额外的操作(通常是再次发送一个新请求)来完成最初的请求。
- 301 Moved Permanently:永久重定向。请求的资源已被永久分配了新的 URI。今后任何对此资源的引用都应使用新的 URI。搜索引擎会将权重转移到新URL。
- 302 Found:临时重定向。请求的资源临时从不同的 URI 响应请求。由于历史原因,它有时被不准确地解释为 “Moved Temporarily”。客户端应继续使用原始 URI 进行未来的请求。
- 304 Not Modified:资源未改变。当客户端发送带条件的 GET 请求(例如
If-Modified-Since头)时,如果资源自指定时间后未被修改,服务器会返回此状态码,告诉客户端直接使用本地缓存。这可以节省带宽和提高加载速度。
4xx - 客户端错误状态码
表示错误似乎是来自客户端的原因。
- 400 Bad Request:错误的请求。服务器无法理解请求的格式,通常是语法错误(如错误的请求结构、无效的请求消息帧)。
- 401 Unauthorized:未授权。请求需要用户认证。通常伴随着
WWW-Authenticate头,指示如何进行认证。注意,这个名字容易引起误解,它实际指的是“认证”(Authentication)失败,而非“授权”(Authorization)。 - 403 Forbidden:禁止访问。服务器理解请求,但拒绝执行。与 401 不同,服务器知道你的身份,但你的权限不足。例如,尝试访问没有权限的目录或文件。
- 404 Not Found:最著名的错误码。服务器找不到请求的资源。也可能是服务器不想告诉你为什么拒绝请求,或者没有其他响应可用。
5xx - 服务器端错误状态码
表示服务器在处理请求时发生了错误。
- 500 Internal Server Error:服务器内部错误。一个通用的错误消息,表示服务器遇到了一个未曾预料的状况,导致它无法完成对请求的处理。通常是服务器端应用程序(如 PHP, Java)代码出错。
- 502 Bad Gateway:错误的网关。服务器作为网关或代理,从上游服务器收到了无效的响应。常见于 Nginx 后面的 PHP-FPM 或后端应用服务器崩溃或没有响应。
- 503 Service Unavailable:服务不可用。服务器当前无法处理请求(由于超载或系统停机维护)。通常,这是临时状态。响应中可能会包含
Retry-After头,告诉客户端何时可以重试。 - 504 Gateway Timeout:网关超时。服务器作为网关或代理,未能及时从上游服务器收到响应。这通常意味着后端服务器在处理请求时花费了太长时间。
三、如何查看和使用状态码
- 开发者工具:在浏览器中按 F12 打开开发者工具,进入 “Network”(网络) 标签页。刷新页面,你会看到所有网络请求,其中 “Status” 列就是 HTTP 状态码。
- 命令行工具:使用
curl命令时,可以添加-I或-i选项来查看响应头和信息。curl -I https://www.example.com - 后端调试:在后端代码中,你可以设置返回特定的状态码(例如,在 Node.js 中用
res.status(404).send(...),在 PHP 中用http_response_code(404))。
四、总结与最佳实践
- 对用户友好:对于 4xx 和 5xx 错误,最好配置一个自定义错误页面,而不是显示默认的浏览器错误页,以提供更好的用户体验。
- 正确使用重定向:理解 301 和 302 的区别,对 SEO 和浏览器缓存行为有重要影响。
- 善用缓存:正确使用 304 状态码可以极大提升网站性能,减少服务器负载。
- 监控 5xx 错误:5xx 错误是服务器健康度的晴雨表,需要被持续监控和及时处理。
掌握 HTTP 状态码能帮助你快速定位和解决问题,是 Web 开发和运维的一项基础且重要的技能。
