http状态码

233 阅读9分钟

HTTP 状态码详解

HTTP 状态码是服务器在响应客户端请求时返回的三位数字代码,用于表示请求的处理结果。它们分为五个类别:

  • 1xx (信息性状态码):请求已被接收,继续处理。
  • 2xx (成功状态码):请求已成功被服务器接收、理解并接受。
  • 3xx (重定向状态码):需要客户端采取进一步的操作才能完成请求。
  • 4xx (客户端错误状态码):请求含有语法错误或者无法被满足。
  • 5xx (服务器错误状态码):服务器在处理某个看来有效的请求时发生错误。

1. 常见 1xx 状态码 (信息性)

这些状态码表示临时响应,意味着请求已被接收,客户端应继续等待最终响应。在日常浏览器交互中,这些状态码对用户是透明的。

状态码名称含义典型用途与行为说明
100Continue继续。客户端应继续其请求。服务器已收到请求头,并且客户端应继续发送请求体。客户端在发送较大请求体(如 POST 数据)前,可设置头 Expect: 100-continue 来询问服务器是否接受。服务器认可则返回 100,客户端再发送 body。
101Switching Protocols切换协议。服务器根据客户端的请求切换协议。主要用于升级到 WebSocket 连接。客户端请求升级,服务器同意后返回 101,随后通信便使用新的 WebSocket 协议。
102Processing处理中。服务器已收到并正在处理请求,但尚无响应可用。用于防止客户端因长时间处理请求而超时,认为请求丢失。主要用于分布式或需要长时间处理的请求。
103Early Hints早期提示。服务器在完整响应准备好之前,先返回一些提示信息(如需要预加载的资源)。允许浏览器在服务器准备最终响应的同时,提前开始预加载关键资源(如 CSS, JS),从而优化页面加载速度

2. 常见 2xx 状态码 (成功)

表示请求已成功被服务器处理、理解和接受。这是客户端最希望看到的一类状态码。

状态码名称含义典型用途与行为说明
200OK成功。请求成功。对于 GET 请求,资源已在响应体中返回;对于 POST 请求,结果已在响应体中返回。最常见的成功状态码。适用于绝大多数成功请求。
201Created已创建。请求成功并且服务器创建了新的资源。POST 或 PUT 请求创建新资源后的典型响应。响应头 Location 应包含新资源的 URL。
202Accepted已接受。服务器已接受请求,但尚未处理完成。请求可能会被处理,也可能不会被处理。适用于需要排队处理的异步任务(如报表生成、视频转码)。响应中应包含指示当前状态的信息或一个监控进度的 URL。
203Non-Authoritative Information非授权信息。服务器是转换代理(如 CDN),返回的元信息来自源服务器的 200 响应,但已被修改。较为少见。表示响应头字段可能与原服务器不同。
204No Content无内容。服务器成功处理了请求,但不需要返回任何实体内容。适用于无需更新页面的操作,如提交表单后只需清空表单字段,或 PUT 请求更新资源但客户端无需反馈。浏览器显示不变。
205Reset Content重置内容。与 204 类似,但要求客户端重置当前表单的视图。告知客户端(通常是浏览器)清空当前表单的所有输入字段,以便用户进行下一次输入。
206Partial Content部分内容。服务器成功处理了客户端的部分 GET 请求

1. 常见 3xx 状态码及其区别

您提供的表格非常完美,这里直接保留:

状态码名称含义典型用途浏览器/爬虫行为
301Moved Permanently永久移动。请求的资源已永久移动到 Location 指定的新 URL。网站域名更改、永久性 URL 结构调整。更新书签/收藏夹搜索引擎更新索引到新 URL。
302Found临时移动。请求的资源暂时从另一个 URL 响应。临时维护页面、A/B 测试、临时登录跳转。不会更新书签/收藏夹搜索引擎继续索引原 URL
303See Other查看其他地址。响应可以在另一个 URL 上找到(通常用于 POST 后的重定向)。表单提交后重定向到结果或状态页面。通常使用 GET 方法请求新 URL。
304Not Modified未修改。资源未更改,客户端可继续使用缓存版本。 (特殊重定向)浏览器缓存验证(If-Modified-Since/If-None-Match)。使用本地缓存,不实际下载资源。
307Temporary Redirect临时重定向。与 302 类似,但严格要求客户端不改变原始请求方法。需要保持原始请求方法(如 POST)的临时重定向。使用原请求方法(如 POST)请求新 URL。
308Permanent Redirect永久重定向。与 301 类似,但严格要求客户端不改变原始请求方法。需要保持原始请求方法(如 POST)的永久重定向。使用原请求方法(如 POST)请求新 URL。

核心区别小结

  • 永久 vs 临时:301/308 是永久的,302/303/307 是临时的。
  • 方法是否改变:301/302 允许浏览器将 POST 改为 GET(老标准),而 307/308 严禁改变方法。
  • 303 明确要求客户端使用 GET 方法,常用于 POST 后的重定向,以避免重复提交表单。

2. 常见 4xx 状态码 (客户端错误)

正如您所说,4xx 状态码通常表示请求本身存在问题,责任方在客户端(如浏览器、爬虫或用户)。

状态码名称含义典型场景与排查建议
400Bad Request错误请求。服务器无法理解请求的格式,通常是语法错误(如参数错误、JSON格式错误)。前端代码错误、上传的文件格式或大小不符、请求参数拼写错误。检查请求头(Headers)和请求体(Body)格式。
401Unauthorized未授权。请求要求身份验证。用户需要提供认证凭证(如登录)。用户未登录或登录态已过期。检查是否需要携带有效的 Token、Cookie 或进行 Basic 认证。问题在于“认证”(Authentication)
403Forbidden禁止访问。服务器理解请求,但拒绝执行。身份认证已通过,但权限不足。用户已登录,但尝试访问其他用户的私有数据或未被授予权限的管理员功能。问题在于“授权”(Authorization)
404Not Found未找到。服务器无法找到请求的资源。最常见的错误。URL 拼写错误、链接失效、资源已被删除。检查请求的 URL 路径是否正确。
405Method Not Allowed方法不被允许。请求行中指定的请求方法不能被用于请求相应的资源。对只支持 GET 的接口发起了 POST 请求,或对只支持 POST 的接口发起了 GET 请求。服务器应在响应头 Allow 中告知允许哪些方法(如 GET, POST)。
408Request Timeout请求超时。服务器等待客户端发送请求的时间过长。网络连接缓慢,或客户端在发送大量数据前未及时推送心跳包。
429Too Many Requests请求过多。用户在给定的时间内发送了太多请求(“限速”或“频次控制”)。防止爬虫或暴力破解。客户端应放慢请求速度,并检查响应头中是否包含 Retry-After 指示多久后可以重试。

3. 常见 5xx 状态码 (服务器错误)

5xx 状态码表示服务器处理有效请求时内部发生了错误,责任方在服务器端

状态码名称含义典型原因与排查建议
500Internal Server Error服务器内部错误。一个笼统的、通用的错误消息,表明服务器遇到了一个未曾预料的状况。后端代码出现未捕获的异常(如空指针、数据库查询错误)、服务器配置错误(如 .htaccessnginx.conf 配置有误)。查看服务器错误日志。
501Not Implemented尚未实施。服务器不具备完成请求的功能。客户端请求了服务器不支持的功能(如请求一个 WebDAV 方法而服务器并未实现)。
502Bad Gateway错误网关。作为网关或代理的服务器,从上游服务器收到无效响应。很常见。通常意味着后端应用服务器(如 Tomcat, PHP-FPM)无响应、已崩溃或未启动。检查上游服务状态和网络连接。
503Service Unavailable服务不可用。服务器当前无法处理请求(由于超载或停机维护)。服务器因流量过大而限流、正在进行停机维护。通常响应头应包含 Retry-After 告知客户端何时可恢复。
504Gateway Timeout网关超时。作为网关或代理的服务器,未能及时从上游服务器收到响应。上游服务器处理时间过长,导致代理服务器等待超时。排查上游服务器的性能问题(如慢查询、死锁)。
505HTTP Version Not SupportedHTTP 版本不受支持。服务器不支持请求中所用的 HTTP 协议版本。非常罕见。客户端使用了服务器不支持的 HTTP 版本(如 HTTP/2.0 或 HTTP/3.0)发起请求。

总结

  • 看到 3xx:关注重定向的目标和类型,理解其对 SEO 和缓存的影响。
  • 看到 4xx检查你的请求。问题出在客户端,需要检查 URL、参数、 headers 和身份认证信息。
  • 看到 5xx联系网站管理员。问题出在服务器端,普通用户通常无法解决,需要后端开发或运维人员查看服务器日志进行排查。