一、状态码的作用
HTTP状态行中使用状态码(Status Code)和原因短语(Reason Phrase)来简单描述请求的结果
Version: 版本号,例如HTTP/2
Status Code: 状态码,表示服务器对请求的处理结果
Reason:是状态码的解释说明,例如"OK","Not Found"等等。
Q:所以什么是状态码呢?
A:状态码是用以表示HTTP响应的三位数字代码,由RFC 2616规范定义。合理的状态码可以让用户或浏览器做出更加合适的进一步操作(例如继续发送请求、切换协议等),而且可以让客户端代码更加易于理解和维护。
RFC将状态码分为五类:
分类 | 含义 |
---|---|
1xx | 请求已被接受正在被处理,表示目前是协议处理的中间状态,还需要后续的操作 |
2xx | 请求成功处理,报文已经收到并被正确处理 |
3xx | 表示客户端需要采取进一步操作才能完成请求(例如重定向),通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次相应的Location域中指明 |
4xx | 客户端错误,请求的报文有误,服务器无法处理 |
5xx | 服务器错误,服务器在处理请求时内部发生了错误 |
二、常见的状态码
<1>1xx
1xx代表请求已被接受,需要继续处理。这类响应是临时响应,标示客户应该等待服务器采取进一步行动
-
101(Switching Protocols)
服务器已经理解了客户端的请求,并根据Upgrade消息头切换协议
<2>2xx
表示请求已经成功被服务器接收、理解并接受
-
200 (OK)
这是最常见的一种状态码,表示请求成功
-
204 (NO Content)
与200基本相同,但响应头后没有body数据
-
206 (Partial Content)
分片传输,每次只返回了请求资源的部分,常用于实现断点续传或者将一个大文档分解为多个下载段同时下载
<3>3xx
这类状态码表示需要客户端采取进一步操作才能完成请求。
通常这些状态码用来重定向,重定向目标在本次响应的Location头字段中指明。
常见状态码及其含义:
状态码 | 状态短语 | 状态含义 |
---|---|---|
300 | Multiple Choices | 当请求的URL对应有多个资源时(如同HTML的不同版本),返回这个代码时,可以返回一个可选列表,这样用户可以自行选择。通过Location头字段可以自定首选内容。 |
301 | Moved Permanetly | 当前请求的资源已被移除时使用,响应的Location头字段会提供现在的URL。直接使用GET方法发起新请求 |
302 | Found | 与301类似,但客户端只将Location返回的URL当作临时资源来使用,将来请求时,还是使用老的URL。直接使用GET方法发起新请求 |
303 | See Other | 用于在PUT或者POST请求之后进行重定向,这样结果页就不会再次触发重定向了 |
304 | Not Modified | 资源没有修改,表示本地缓存仍然可用。产生这个状态的前提是:客户端本地已经有缓存的版本,并且在Request中告诉了服务端,当服务端通过时间或者Etag发现没有更新时,就会返回一个不含body的304状态 |
305 | Use Proxy | 用来表示必须通过一个代理来访问资源,代理的位置由Location头字段给出 |
306 | Switch Proxy | 最初是指“后续请求应使用指定的代理”,在最新版的规范中,306状态码已经不再被使用 |
307 | Temporary Redirect | 与302类似,但是使用原请求方法发起新请求 |
308 | Permanent Redirect | 与302类似,但是使用原请求方法发起新请求 |
这九种状态码大致可以分为三类,分别是:永久重定向、临时重定向和特殊重定向
-
永久重定向:301、308
301和308都属于永久重定向。 301本来在规范中是不允许重定向时改变请求方法的(将POST改为GET),但是许多浏览器却允许重定向时改变请求方法(这是一种不规范的实现)。 308的出现也是给上面的行为做个规范,不过是不允许重定向时改变请求方法
-
临时重定向:302、303、307
302、303、307都属于临时重定向,临时是指访问的资源可能暂时先用location的URL访问,但旧的资源还在,下次再来访问的时候可能就不用重定向了。 302和307的关系类似于301和308 303通常用来在创建、修改和删除时展示临时的进度页
-
特殊重定向:300、304、305、306
304是HTTP缓存中的一个重要内容,表示资源未修改,相当于将资源重定向到本地缓存 产生304这个状态的前提是:客户端本地已经有缓存的版本,并且在Request中告诉了服务端当服务端通过时间或者Etag发现没有更新时,就会返回一个不含body的304状态
<4>4xx
表示客户端发送的请求报文有误,服务器无法处理,它是真正的“错误码”含义
-
400 (Bad Request)
由于明显的客户端错误(例如,请求语法格式错误,无效的请求消息等),服务器不能或者不会处理该请求
-
403 (Forbidden)
表示服务器禁止访问资源。原因可能多种多样,例如信息敏感、法律禁止等等
-
404 (Not Found)
请求失败,请求的资源未在服务器上发现,但允许用户的后续请求
<5>5xx
服务器错误,服务器在处理请求时内部发生了错误
-
500 (Internal Server Error)
通用错误消息,服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。没有给出具体的错误信息
-
501 (Not Implemented)
服务器不支持当前请求所需要的某个功能。服务器无法识别请求的方法,并且无法支持其对任何资源的请求
-
502 (Bad Gateway)
作为网关或代理工作的服务器尝试执行请求时,从上游服务器收到无效的响应
-
503 (Service Unavailable)
表示服务器当前很忙,暂时无法响应服务
三、301、302和307的区别(对SEO的影响)
301:可通知搜索引擎蜘蛛,表示某个网页或网站已经被永久移动到新位置
302:搜索引擎蜘蛛会继续抓取原有位置并将其编入索引,因此某个页面或网站已经比移动时,不要使用此代码来通知搜索引擎蜘蛛
307:临时重定向,307的定义实际上和302是一致的,唯一的区别在于,307状态码不允许浏览器将原本的POST请求重定向到GET请求上
四、401和403的区别
401表示发送的请求需要有通过HTTP认证的认证信息
403表示对请求资源的访问被服务器拒绝