Skip to content

HTTP状态码

作者:Annan
发表于:2021-06-12
更新于:几秒前
字数统计:1.8k 字
阅读时长:5 分钟
阅读量:

前言

首先先明确状态码在哪,是在响应报文的的响应头中的状态行中。

curl -I+网址 可以获取到响应头

curl -I https://www.anblog.top

状态行就是画出的蓝色部分

image-20210612224526175

由三个部分组成

Version:Http协议的版本号,通常是HTTP/1.1

Status Code:就是主角状态码,也就是图中的200

Reason:一些对状态码的简短描述,比如200就是OK,301就是Moved Permanently,404就是not found等...(目前大多数客户端都会忽略它)

RFC标准把状态码分为了5类,状态码的实际可用范围是100~599.

什么是RFC

大家公认的一种互联网的标准。

什么是状态码

以代码的形式表示服务器对请求的处理结果。

HTTP五类状态码的含义

  • 1xx : 提示信息,目前是协议处理的中间状态,还需要后续的操作
  • 2xx : 成功,报文已经收到并被正确处理
  • 3xx : 重定向,资源位置发火生变动,需要客户端重新发送请求
  • 4xx : 客户端错误,请求报文有误,服务器无法处理
  • 5xx : 服务器错误,服务器在处理请求的时候内部出现错误

1xx

101 Switching Protocols: 客户端使用Upgrade头字段,要求在HTTP协议的基础上改成其他协议继续通信,比如WebSocket,如果服务器也同意变更协议,就会发送状态码101,后续的数据传输就不会使用HTTP了。

2xx

200 OK : 代表一切正常,服务器和客户端期望一样返回了处理结果,通常在响应头后都会有body数据。

204 No Content: 含义与200相同,但是唯一区别是响应头后面没有body数据。

206 Partial Content: Http分块下载和断点续传的基础,也是服务器处理了请求,但是body中的数据不是资源的全部,是其中的一部分。(206状态码还有一个头字段Content-Range代表body的数据体范围用来和客户端确认,比如Content-Range:bytes 0-99/2000,代表获取的是2000个字节中的前一百个字节)

3xx

301 Moved Permanently :永久重定向,请求的资源已经不存在了,需要用新的URI进行再次访问。

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

304 Not Modified : 在请求页面的时候,如果缓存过期了,在HTTP请求头上的带一个If-None-Match的值,并且和上一次访问产生的响应头的etag的值进行对比判断,如果相同,就代表缓存内容没变,就返回的304。

301 302应用场景

当一个网站或者网页24—48小时内临时移动到一个新的位置,这时候就要进行302跳转,打个比方说,我有一套房子,但是最近走亲戚去亲戚家住了,过两天我还回来的。而使用301跳转的场景就是之前的网站因为某种原因需要移除掉,然后要到新的地址访问,是永久性的,就比如你的那套房子其实是租的,现在租期到了,你又在另一个地方找到了房子,之前租的房子不住了。

301我是用在了跳转HTTPS上,这样访问者就只能访问到你的https网页了。比如你输入http://www.annan.life,然后服务器就会让你重定向到https://www.annan.life

4xx

400 Bad Request :通用的错误码,请求报文有错误,但是错误非常笼统,所以开发web的时候要避免这种笼统的状态码,而应该是有明确含义的状态码。

403 Forbidden : 服务器禁止你访问资源,有的会把原因写在返回的body中,更多的情况就是什么都没有,就一个403。

404 Not Found : 源在本服务器上未找到,所以没法给客户端,根据404你很难判断问题出在哪里。

405 Method Not Allowed :不允许使用某些方法操作资源,例如不允许POST只能GET。

406 Not Acceptable:资源无法满足客户端请求的条件,例如请求中文但只有英文;

408 Request Timeout:请求超时,服务器等待了过长的时间;

409 Conflict:多个请求发生了冲突,可以理解为多线程并发时的竞态;

413 Request Entity Too Large:请求报文里的 body 太大;

414 Request-URI Too Long:请求行里的 URI 太大;

429 Too Many Requests:客户端发送了太多的请求,通常是由于服务器的限连策略;

431 Request Header Fields Too Large:请求头某个字段或总体太大;

5xx

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

“500 Internal Server Error”与 400 类似,也是一个通用的错误码,服务器究竟发生了什么错误我们是不知道的。不过对于服务器来说这应该算是好事,通常不应该把服务器内部的详细信息,例如出错的函数调用栈告诉外界。虽然不利于调试,但能够防止黑客的窥探或者分析。

“501 Not Implemented”表示客户端请求的功能还不支持,以后可能会支持,但是具体什么时间不知道。

“502 Bad Gateway”通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的。

“503 Service Unavailable”表示服务器当前很忙,暂时无法响应服务,我们上网时有时候遇到的“网络服务正忙,请稍后重试”的提示信息就是状态码 503。503 是一个“临时”的状态,很可能过几秒钟后服务器就不那么忙了,可以继续提供服务,所以 503 响应报文里通常还会有一个“Retry-After”字段,指示客户端可以在多久以后再次尝试发送请求。

总结

  1. 在web开发中,能明确的状态码尽量明确给出。

  2. 收到错误码的时候最好是有一个弹窗或者是页面来表示,内容是返回的body中的json数据里的msg字段。

为什么要做重定向?

1)网站调整(如改变网页目录结构);

2)网页被移到一个新地址;

3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。

​ 这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

Contributors

Annan

写代码是热爱,写到世界充满爱