18888628835/Blog

HTTP状态码

18888628835 opened this issue · 0 comments

HTTP状态码

响应报文由响应头和响应体数据组成,响应头由状态行和头部字段组成。

以下是状态行的结构

image.png

在状态行中,协议号版本跟 原因短语(Reason)的作用不是很大,最重要的是状态码。它是一个十进制的数字,以代码的形式表示服务器的处理结果。它的意义在于表达 HTTP 数据处理的状态,客户端可以根据代码适时转换处理状态。

目前 RFC 标准规定状态码为3位数,按照100-599的范围一共分为五类,类别以百分号为标识:

1xx:提示信息,表示目前是协议处理的中间状态,需要后续操作

2xx:成功,报文已经收到并被正确处理

3xx:重定向,资源位置发生变化,需要客户端重新发送请求

4xx:客户端错误,请求报文有误,服务器没办法处理

5xx:服务器错误,服务器在处理请求时内部发生错误

在HTTP中,正确地理解并应用这些状态码不是客户端或者服务器单方的责任,是双方共同的责任。

客户端作为请求的发起方,获取响应报文后,需要通过状态码知道请求是否被正确处理,是否要再次发送请求,如果出错了原因是什么。

服务端作为请求的接收方,也要很好地运用状态码,在处理请求时,选择最恰当的状态码回复客户端,告知客户端处理的结果,指示客户端下一步行动,特别是出错时,尽量不要简单回复400、500这样含糊不清的状态码。

目前 RFC 有41个状态码,但是状态码的定义是开放的,允许自动扩展,下面是常用状态码的介绍。

1xx

1xx类状态码属于提示信息,是协议处理的中间状态,实际运用非常少,偶尔我们会遇到‘101 Switching Protocols’,它的意思是要求客户端在 HTTP 协议的基础上使用其他协议继续通信。

2xx

2xx 表示服务器成功收到并处理了客户端的请求。

200 OK:表示一切正常,服务器返回了处理结果。

204 No Content:表示状态成功,但是响应没有 body 数据。

3xx

3xx 类状态码表示客户端请求的资源发生变动,客户端必须用新的 URI 重新发送请求获取资源,也就是说的重定向。

  • 301 Moved Permanently:永久重定向,意思是此次请求的资源已经不存在了,需要改用新的 URI 访问。

  • 302 Found:临时重定向,意思是请求的资源还在,但是暂时需要另一个 URI 访问。

301和302都会在响应头后使用字段 Location 指明需要跳转的 URI,最终效果类似,但是语义差别很大。

比如 HTTP 升级成 HTTPS,原来的 HTTP 不打算继续用了,这时候就需要用永久重定向301跳转。

有时候服务器升级,暂时服务不可用,这时候可以配置成302临时重定向,浏览器看到302就知道是暂时的情况,不会做缓存优化,第二天还会访问原来的地址。

  • 304 Not Modifield:这个状态码用于缓存控制,它不具备跳转含义,可以理解成重定向到已缓存的文件。在HTTP对比缓存中,如果服务器没有修改资源,那么浏览器就会访问已缓存的文件,并返回这个状态码。

4xx

4xx 类状态码表示客户端发送的请求报文有误,服务器无法处理,它就是真正的错误码含义了。

  • 400 Bad Request:通用错误码,表示请求有误,但是哪里有误没有明确说,只是笼统的错误,一般来说最好使用其他更有明确含义的状态码

  • 403 Forvidden:表示不是客户端请求出错,而是服务器禁止访问资源,有可能是请求没有权限,或者没有登录等等原因。

  • 404 Not Found:表示需要的资源服务器上没找到,只是现在这个状态码被服务端滥用了,只要服务器“不高兴”就直接返回404。

  • 414 Request-URI Too Long:请求的 URL 过长。

5xx

5xx 类状态码表示客户端请求正确,但服务器处理时内部发生错误,无法返回响应数据,是服务器的错误码。

  • 500 Internal Server Error:通用错误码,表示服务器有问题,不过是什么问题就不明说了。实际上这样的处理对于服务器是好事,因为它能够防止黑客的窥探或者分析。

  • 501 Not Implemented:表示客户端请求的功能现在还不支持,敬请期待。

  • 502 Bad Geteway:通常是服务器作为网关或者代理时返回的错误码,表示服务器自身正常,访问后端服务器时发生了错误。

  • 503 Service Unavailable:表示服务器很忙,暂时无法响应服务。503是临时的状态,很可能过一段时间就不忙了,所以503响应报文中通常还会有 Retry-After 的字段,表示过多久再来试试可能就好了。

小结

状态行在响应报文中表示服务器对请求的处理结果

状态码后的原因短语是简单的文字描述,可自定义

状态码是十进制的三位数,从100-599分为五类

1xx:不常用,表示还需要后续操作

2xx:请求并处理成功,常用200、204

3xx:请求重定向,常用301、302、304

4xx:客户端错误,常用400、403、404、414

5xx:服务器错误,常用500、501、502、503

HTTP 状态码总览

HTTP 状态码分类

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

常见的状态码

  • 100 Continue 客户端应继续其请求
  • 200 OK 请求成功。一般用于 GET 与 POST 请求
  • 201 Created 已创建。成功请求并创建了新的资源
  • 202 Accepted 已接受。已经接受请求,但未处理完成
  • 204 No Content 无内容。服务器成功处理,但未返回内容。
  • 301 Moved Permanently 永久重定向
  • 302 Found 临时重定向
  • 304 Not Modified 无修改。当命中协商缓存的时候会发送这个码
  • 400 Bad Request 客户端请求的语法错误,服务器无法理解
  • 401 Unauthorized 请求要求用户的身份认证
  • 403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
  • 404 Not Found 服务器无法根据客户端的请求找到资源(网页)
  • 414 Request-URI Too Large 请求的 URI 过长
  • 500 Internal Server Erro 服务器内部错误,无法完成请求
  • 501 Not Implemented 服务器不支持请求的功能
  • 502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应

临时重定向和永久重定向的区别:

比如你的网站从 HTTP 升级到了 HTTPS 了,以前的站点再也不用了,应当返回 301,这个时候浏览器默认会做缓存优化,在第二次访问的时候自动访问重定向的那个地址。
而如果只是暂时不可用,那么直接返回 302 即可,和 301 不同的是,浏览器并不会做缓存优化。