1.为何会出现状态码
http9.0版本只有get方法,报文格式为纯文本。用户使用过程中产生了新的需求,从用户的角度促进了HTTP的发展。
在HTTP1.0,其中增加了响应状态码,标记可能出错的原因;引入了协议版本号的概念。
2.状态行结构
响应状态行:版本号、状态码、原因
HTTP/1.1 200 OK
状态码:表达HTTP数据处理的“状态”,客户端可以依据代码适时转换处理状态,例如继续发送请求,切换协议,重定向跳转等。
这五类的具体含义是:
- 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作;
- 2××:成功,报文已经被服务器收到并被正确处理;
- 3××:重定向,资源位置发生变动,需要客户端重新发送请求;
- 4××:客户端错误,请求报文有误,服务器无法处理;
- 5××:服务器错误,服务器在处理请求时内部发生了错误。
1××
1××类状态码属于提示信息,是协议处理的中间状态,实际能够用到的时候很少。
2×× 成功状态码
2××类状态码表示服务器收到并成功处理了客户端的请求,这也是客户端最愿意看到的状态码。
- 200 OK
- 204 No Content 。响应头没有body数据。
3××
3××类状态码表示客户端请求的资源发生了变动,客户端必须用新的 URI 重新发送请求获取资源,也就是通常所说的“重定向”,包括著名的 301、302 跳转。
- 301 永久重定向
该状态码表示请求的资源已经被分配了新的 URI,以后应使用资源指定的 URI。新的 URI 会在 HTTP 响应头中的 Location 首部字段指定。
使用场景:
当我们想换个域名,旧的域名不再使用时,用户访问旧域名时用301就重定向到新的域名。其实也是告诉搜索引擎收录的域名需要对新的域名进行收录。
在搜索引擎的搜索结果中出现了不带www的域名,而带www的域名却没有收录,这个时候可以用301重定向来告诉搜索引擎我们目标的域名是哪一个。
- 302 临时重定向,意思是请求的资源还在,但需要暂时用另一个URI来访问
比如,你的网站升级到了 HTTPS,原来的 HTTP 不打算用了,这就是“永久”的,所以要配置 301 跳转,把所有的 HTTP 流量都切换到 HTTPS。再比如,今天夜里网站后台要系统维护,服务暂时不可用,这就属于“临时”的,可以配置成 302 跳转,把流量临时切换到一个静态通知页面,浏览器看到这个 302 就知道这只是暂时的情况,不会做缓存优化,第二天还会访问原来的地址。
304 Not Modified 表示资源未修改,用于缓存控制。它不具有通常的跳转含义,但可以理解成“重定向已到缓存的文件(即缓存重定向)”。
- 304浏览器缓存相关
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关系。
带条件的请求(Http 条件请求):使用 Get方法 请求,请求报文中包含(if-match、if-none-match、if-modified-since、if-unmodified-since、if-range)中任意首部。
状态码304并不是一种错误,而是告诉客户端有缓存,直接使用缓存中的数据。返回页面的只有头部信息,是没有内容部分的,这样在一定程度上提高了网页的性能。
4××
4××类状态码表示客户端发送的请求报文有误,服务器无法处理,它就是真正的“错误码”含义了。
- 400 表示请求报文有错误;
- 401 表示请求验证失效;
- 403 表示服务器禁止访问资源;
- 404 资源在本服务器上未找到;
- 405 该状态码表示客户端请求的方法虽然能被服务器识别,但是服务器禁止使用该方法;
5xx
5××类状态码表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据,是服务器端的“错误码”。
- 500 服务器通用错误码
- 501 客户端请求的功能还不支持
- 503 服务器当时很忙,暂时无法响应服务
- 504 该状态码表示网关或者代理的服务器无法在规定的时间内获得想要的响应。他是HTTP 1.1中新加入的。(代码执行时间超时,或者发生了死循环)。