HTTP状态码
HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。本篇博客将为大家总结一下常见的HTTP状态码,以及个别状态码之间的对比。
HTTP状态码的类别
类别 | 原因短语 | |
---|---|---|
1XX | Information(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
在文档中记录的HTTP状态码就有40种,再加上web服务器和拓展码就多达60多种,但是我们经常使用的状态码只有一下这实际种,所以我们重点来介绍常用的一些状态码
以1开头的信息性状态码
100 continue
以1开头最常见的状态码就是100,表示客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。这个状态码经常出现在使用POST方法传输资源完成TCP的三次握手之后,客户端向服务器先进行确认,当服务器返回100 continue的响应报文客户端才接着发送数据。如果不太清楚这个知识点的同学可以戳这里浅谈HTTP的方法。
以2开头的成功状态码
200 ok
不难理解,此状态码表示从发送端发来的请求被服务端正常的处理了。在响应报文中,返回的信息会随方法的不同发生变化,如果是GET方法则会返回请求的资源,而如果是HEAD方法则只会返回响应报文除去报文实体的部分。
204 no content
该状态码代表服务器接收的请求已经被成功处理,但在返回时不包含资源的主体部分。此状态一般表示浏览器显示的页面不发生更新。
一般是在客户端向服务器发送信息,而服务器不需要发送新信息内容的情况下使用。
206 partial content
该状态码表示客户端进行了范围请求,比如一张图片本来1000k,在传输过程中后500k丢失了,此时客户端就会向服务器进行范围请求。如果服务器成功执行了这部分请求,就会返回206 partial content的响应。
以3开头的重定向状态码
以3开头的状态码表示浏览器需要执行某些特殊的处理以正确的处理请求。
301 moved permanently
301状态码也叫做永久性重定向,根本原因是所请求的资源已经被重新分配了URL,以后要请求此资源时应该使用响应报头location字段所填充的新的URL。
302 found
302也叫临时性重定向,他和301状态码非常的相似,表示访问的资源被重新分配了URL,希望用户本次使用新的URL进行访问。302代表资源并不是被永久移动的,只是临时性质的。换句话说,已经移动的资源对应的URL还有可能发生改变,所以后续请求依然使用原地址。
302重定向事实上存在一定的问题,比如网站劫持,网上大佬是这么说的:A站通过重定向到B站的资源xxoo,A站实际上什么都没做但是有一个比较友好的域名,web资源xxoo存在B站并由B站提供,但是B站的域名不那么友好,因此对搜索引擎而言,可能会保存A站的地址对应xxoo资源而不是B站,这就意味着B站出了资源版权、带宽、服务器的钱,但是用户通过搜索引擎搜索xxoo资源的时候出来的是A站,A站什么都没做却被索搜引擎广而告之用户,B站做了一切却不被用户知道,价值被A站窃取了
不仅仅是这样,现在大多数的浏览器都没有遵守302的使用规范,文档规定,如果原请求是get、head方法则可以进行自动重定向,而如果原请求是post方法,则不能自动进行重定向。
303 see other
所以在http1.1版本中出现了303状态码和307状态码,这两个状态码实际是对http1.0版本中的302的进一步的规范。http1.1的301还是与1.0版本中相同,而302只是为了兼容1.0版本,在新规范中已经不推荐使用。
303则继承了http1.0版本中302的实现,也就是说无论源请求是get和post方法都可以自动进行重定向。
307 temporary redirect
303则继承了http1.0版本中302的规范,307会按照浏览器的标准,如果不是GET和HEAD方法,他一定不会自动进行重定向,就算location填充了相关的URL信息也会直接被忽略。
不过笔者想说的是,虽然现在http已经明确将302划分为303和307,但是还是存在大多数浏览器不能理解303状态码。
304 not modified
将304放到最后说是因为304虽然处于重定向系列状态码,但是他却与重定向没有一点关系。该状态码表示服务端允许请求访问资源,但未满足条件。所以304在返回时也像204那样不返回任何资源。
以4开头的客户端错误状态码
400 bad request
该状态码表示请求报文中存在语法错误。当错误发生时,需要修改请求的内容后再次发送请求。另外,浏览器回像200 ok一样对待该状态码。
401 unauthorized
该状态码表示发送的请求需要有通过HTTP认证,说的简单一点:假设当前网页访问资源需要认证就会返回401 unauthorized响应并弹出认证框,假设认证失败则会再次返回401并在响应报头中添加认证失败的相关信息
403 forbidden
403表示对资源的访问被服务器拒绝了。服务端没有必要给出拒绝的详细理由,但是如果需要说明的话,可以在报文的主体部分对原因进行描述,这样就可以让用户看到了。
未获得文件系统的访问授权,从未授权的发送源ip地址试图访问等都是可能出现403的原因。
404 not found
这个状态码应该是我们平时见到最多的状态码了,发生404表示我们请求的资源在服务器上不存在。原因很容易理解,但是有的同学不理解为什么这是客户端错误,找不到不应该是服务器错误么?这里其实举一个很简单的例子,你家月收入五千,但是你开口就向家里要10亿,明显这是你对不可能存在的资源进行请求。
413 request entity too large
这个状态码真的很少见到,但是你一定要了解,因为我们知道在使用GET方法请求时参数是在URL中传参的,不同的浏览器对于URL的长度有不同的要求,如果你的URL长度超过了浏览器或服务器规定的长度,那么有可能被直接截断或者返回413状态码,表示请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。
以5开头的服务器错误状态码
500 inernal server error
该状态码表示服务器端在执行请求时发生了错误,举个简单的例子,某种情况下服务器要执行其他程序来处理你所发出的请求,但是凑巧这个程序奔溃了,此时就会返回500的错误响应。有时候返回500状态码也可能是web应用出现了错误。
503 service unavailable
该状态码表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果知道解决问题需要时间,那么一般会写入retry after首部字段在返回给客户端。
总结
我们一般平时见到的状态码只有以上笔者总结的这么多,但是相信实际使用时可能遇到的更少。图解HTTP中明确说明,不少返回的状态响应都是错误的,但是用户可能察觉不到这一点。比如web程序内部程序发生了错误,状态码却依旧返回了200 ok,这种情况经常遇到。