HTTP状态码

一、状态码的作用

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头字段中指明。

常见状态码及其含义:

状态码状态短语状态含义
300Multiple Choices当请求的URL对应有多个资源时(如同HTML的不同版本),返回这个代码时,可以返回一个可选列表,这样用户可以自行选择。通过Location头字段可以自定首选内容。
301Moved Permanetly当前请求的资源已被移除时使用,响应的Location头字段会提供现在的URL。直接使用GET方法发起新请求
302Found与301类似,但客户端只将Location返回的URL当作临时资源来使用,将来请求时,还是使用老的URL。直接使用GET方法发起新请求
303See Other用于在PUT或者POST请求之后进行重定向,这样结果页就不会再次触发重定向了
304Not Modified资源没有修改,表示本地缓存仍然可用。产生这个状态的前提是:客户端本地已经有缓存的版本,并且在Request中告诉了服务端,当服务端通过时间或者Etag发现没有更新时,就会返回一个不含body的304状态
305Use Proxy用来表示必须通过一个代理来访问资源,代理的位置由Location头字段给出
306Switch Proxy最初是指“后续请求应使用指定的代理”,在最新版的规范中,306状态码已经不再被使用
307Temporary Redirect与302类似,但是使用原请求方法发起新请求
308Permanent 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表示对请求资源的访问被服务器拒绝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值