HTTP 状态码是服务器和客户端之间交流信息的语言,状态码的第一位数字表示响应的类别,从 1 到 5 共分五大类。下面按类别列出一些常见的 HTTP 状态码。
1XX:信息类状态码
1XX 系列代表请求已被接受,需要继续处理。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码(HTTP 各版本的演进可以参见本站的《HTTP 前世今生》),所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。这一类中最常见的有 100、101 状态码:
100 Continue:服务器告知客户端可以继续发送请求的剩余部分。客户端在发送大体积请求体之前,可以先带上Expect: 100-continue请求头探路,收到该响应后再把数据发出去(POST 请求“先发 header 等确认、再发 data”的两步机制,理论上依赖的就是它,参看本站的《GET 与 POST 的区别》)101 Switching Protocols:服务器应客户端Upgrade请求头的请求,切换到另一种协议,例如从 HTTP 切换到 WebSocket
2XX:成功
2XX 系列代表请求已被服务器成功接收、理解并接受。这系列中最常见的有 200、201 状态码:
200 OK:请求已成功,请求所希望的响应头或数据体将随此响应返回201 Created:请求成功并且服务器创建了新的资源,且其 URI 已随Location头信息返回;假如需要的资源无法及时建立的话,应当返回202 Accepted202 Accepted:服务器已接受请求,但尚未处理完成。处理是异步进行的,客户端无法通过本次响应得知最终结果204 No Content:请求成功,但响应报文中不含实体内容,服务器只是告知“处理成功,没有更多要说的”,常用于删除资源成功、提交表单成功但无需返回内容等场景206 Partial Content:服务器成功处理了带Range头的部分请求,断点续传和视频拖动进度条依赖的就是它
3XX:重定向
3XX 系列代表需要客户端采取进一步的操作才能完成请求,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。这系列中最常见的有 301、302、304 状态码:
301 Moved Permanently:被请求的资源已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置302 Found:请求的资源临时从不同的 URI 响应请求,但请求者应继续使用原有位置来进行以后的请求303 See Other:请求的资源临时换到了另一个 URI,应改用 GET 方法去请求新地址,常见于表单 POST 提交成功后跳转到结果页304 Not Modified:自从上次请求后,请求的网页未修改过,服务器返回此响应时不会返回网页内容。如果网页自请求者上次请求后再也没有更改过,应将服务器配置为返回此响应(配合If-Modified-Since或If-None-Match请求头使用)307 Temporary Redirect:语义与 302 类似,但明确规定浏览器不得把 POST 改写为 GET,必须用原方法重新请求新地址308 Permanent Redirect:语义与 301 类似,同样不允许更改请求方法,区别只在“永久”
4XX:客户端错误
4XX 系列表示请求错误,代表客户端看起来可能发生了错误,妨碍了服务器的处理。常见有 400、401、403、404 状态码:
400 Bad Request:请求报文中存在语法错误,服务器无法理解401 Unauthorized:请求要求身份验证。对于需要登录的网页,服务器可能返回此响应403 Forbidden:服务器已经理解请求,但是拒绝执行它。与 401 响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交404 Not Found:请求失败,请求所希望得到的资源未在服务器上发现,没有信息能够告诉用户这个状况到底是暂时的还是永久的。404 也被广泛应用于当服务器不想揭示到底为何请求被拒绝,或者没有其他适合的响应可用的情况下405 Method Not Allowed:请求方法不被资源支持,例如对只接受 GET 的资源发起了 POST 请求,响应中一般会带上Allow头说明支持的方法408 Request Timeout:客户端没有在服务器愿意等待的时间内完成请求,客户端可以稍后重试410 Gone:请求的资源已经永久不可用,且没有任何已知的转发地址。与 404 不同的是,410 明确告诉客户端这是永久性的,搜索引擎也会据此删除对该资源的收录429 Too Many Requests:客户端在一段时间内发送了太多请求,也就是常说的“被限流了”
5XX:服务器错误
5XX 系列代表服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。常见有 500、503、504 状态码:
500 Internal Server Error:服务器遇到了一个未曾预料的状况,导致它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现501 Not Implemented:服务器不支持完成请求所需要的功能,例如无法识别的请求方法502 Bad Gateway:服务器作为网关或代理,从上游服务器收到了无效的响应503 Service Unavailable:由于临时的服务器维护或者过载,服务器当前无法处理请求。通常这是一个暂时状态,一段时间后会恢复504 Gateway Timeout:网关超时,指服务器作为网关或代理,没有及时从上游服务器收到响应。注意与 502 的区别:502 是收到了无效响应,504 是压根没等到响应505 HTTP Version Not Supported:服务器不支持请求中所使用的 HTTP 协议版本