`

HTTP状态码302、303和307的故事

    博客分类:
  • Http
 
阅读更多
《HTTP权威指南》第3章在讲解30X状态码时,完全没有讲清楚为什么要有302、303、307,以及他们的关系,一句“问题出在HTTP/1/1”让我一头雾水,莫名其妙;而第五章在讲重定向响应时,没有说到现在很常见的302,反而是说我从没遇到过的303和307。很是迷惑,对于这3个状态码,WiKi和RFC文档都有详解,下面我以我的思维添油加醋的描述一遍。

一、状态码——302

    RFC1945(http://tools.ietf.org/html/rfc1945#page-34),也就是HTTP1.0在介绍302时说,如果客户端发出POST请求后,收到服务端的302状态码,那么不能自动的向新的URI发送重复请求,必须跟用户确认是否该重发,因为第二次POST时,环境可能已经发生变化(嗯,POST方法不是幂等的),POST操作会不符合用户预期。但是,很多浏览器(user agent我描述为浏览器以方便介绍)在这种情况下都会把POST请求变为GET请求。
    RFC2616(http://tools.ietf.org/html/rfc2616#section-10.3.3),也就是HTTP1.1在介绍302时说,如果客户端发出非GET、HEAD请求后,收到服务端的302状态码,那么就不能自动的向新URI发送重复请求,除非得到用户的确认。(又是-,-)但是,很多浏览器都把302当作303处理了(注意,303是HTTP1.1才加进来的,其实从HTTP1.0进化到HTTP1.1,浏览器什么都没动),它们获取到HTTP响应报文头部的Location字段信息,并发起一个GET请求。

二、状态码——303和307

    从上面的介绍可以知道,HTTP1.1和HTTP1.0的302状态码意义是一样的,浏览器对它的处理也是一样的。POST方法的重定向在未询问用户的情况下就变成GET,这种不符合文档规范的问题依然存在。实践在前而文档在后,HTTP1.1把这种POST变GET的行为纳入了RFC文档:HTTP1.1新加入303和307状态码。
    文档中规定303状态码的响应,也就是上边提到的现在浏览器对302状态码的处理:POST重定向为GET。
    307状态码则相当于HTTP1.0中302状态码,当客户端的POST请求收到服务端307的状态码的响应时,需要跟用户询问是否应该在新URI上发起POST方法,也就是说,307是不会把POST转为GET的。
    从网络上搜索到这个说法“303:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。 307:对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。”,从上面的介绍可以明白,这个说法是臆想而已,文档并没有这么说,而业界是否统一如此处理,还不好说,我没有抓到过307和303的包。
    文档也说到,为兼容很多HTTP1.1之前的浏览器,服务端在需要发出303状态码时,会选择用302状态码替代;而对于307的处理,则需要在响应实体中包含信息,以便不能处理307状态码的用户有能力在新URI中发起重复请求,也就是说,把重定向的页面展示给用户,让用户去点重定向URI链接(URI现在基本就是URL)。

三、总结

    303和307是HTTP1.1新加的服务器响应文档的状态码,它们是对HTTP1.0中的302状态码的细化,主要用在对非GET、HEAD方法的响应上。文档规定:浏览器对303状态码的处理跟原来浏览器对HTTP1.0的302状态码的处理方法一样;浏览器对307状态码处理则跟原来HTTP1.0文档里对302的描述一样。 
    303和307的存在,归根结底是由于POST方法的非幂等属性引起的。
    在HTTP1.1中,302理论上是要被放弃掉的,它被细化为303和307,但为了兼容,它目前还在业界中大量使用,而303和307状态码我还没遇到过(没有使用场景,也没抓到过这样的响应报文)。为什么业界少使用303和307呢?对于GET和HEAD方法来说,307是没必要存在的,用302或者303就可以满足需求了,307仅在POST方法的重定向上有用处。所以我猜测它们少见的原因有两方面:1、POST方法重定向的使用场景太少,使得307状态码没有用武之地;2、GET方法虽然常需要使用的重定向,但使用302状态码也能正确运转,再考虑到微乎其微的兼容问题(现在的浏览器怎么可能不支持HTTP1.1呢!),也就没有使用303的必要了。
   
参考资料:
2、RFC1945 http://tools.ietf.org/html/rfc1945#page-34
3、RFC2616 http://tools.ietf.org/html/rfc2616#section-10.3.3
 
from http://www.cnblogs.com/cswuyg/p/3871976.html
分享到:
评论

相关推荐

    易语言取HTTP状态码

    HTTP状态码是服务器对客户端请求的响应,通常由三位数字组成,分为五类:1XX(信息响应)、2XX(成功)、3XX(重定向)、4XX(客户端错误)和5XX(服务器错误)。例如,200表示请求成功,404表示找不到资源,500表示...

    取HTTP状态码.rar

    通常,这些状态码用来重定向,如301(永久移动)和302(临时移动)。 4. 4xx(请求错误):这类状态码表示请求包含错误语法或者无法完成请求,例如400(坏请求)、401(未授权)和404(未找到)。 5. 5xx(服务器...

    HTTP状态码大全HTTP状态码大全

    - **307 Temporary Redirect**:和302 Found类似,但明确要求客户端保留原本的请求方法,即如果是POST方法则重定向时也必须使用POST方法。 #### 4. 客户端错误状态码 (400-499) 这类状态码表示客户端可能发生了...

    axios 处理 302 状态码的解决方法

    302状态码是HTTP协议中的一个状态码,表示临时重定向。当服务器返回这个状态码时,它会同时提供一个新的URL(在`Location`响应头中),浏览器会自动转向这个新URL。对于传统的页面刷新,这种行为是期望的,但对于...

    http状态码信息,详细描述了http各状态码的含义

    这些状态码分为五大类,每类都对应着特定的含义和应用场景。 100-199的范围是临时响应,主要用于通知客户端一些中间状态。例如,状态码100(Continue)表明服务器已经接收到请求头,客户端可以继续发送请求体,如果...

    HTTP状态码的含义.txt

    ### HTTP状态码详解 HTTP(超文本传输协议)是用于从Web服务器传输超文本到本地浏览器的传送协议。HTTP状态码是由三个十进制数字组成的响应状态代码,它定义了客户端请求服务器后的结果状态。HTTP状态码的第一位...

    http状态码批量检测工具 v1.11.39.0

    http状态码批量检测工具是杭州光年出品的一个网页http状态码批量查询工具,支持批量导入URL,并查询其HTTP状态码,避免了同时检测多个页面时造成时间上的浪费和一些麻烦,查询结果可以导出为CSV文件保存,便于...

    HTTP状态码大全 .doc

    302(Found)表示资源临时移动,303(See Other)建议客户端使用GET方法访问新的URL。304(Not Modified)表明资源自上次请求后未更改,客户端可继续使用缓存版本。 400-499:客户端错误状态码 这类状态码表示...

    HTTP返回状态码大全

    ### HTTP返回状态码详解 #### 一、信息性状态码(1xx) **100 Continue** - **含义**:初始请求已经被...通过正确识别和解释这些状态码,开发者和网络管理员可以有效地诊断问题、优化应用程序性能并提升用户体验。

    HTTP 状态码

    HTTP协议定义了多种状态码,每个状态码都是三位数字,分为五类:信息响应(1XX),成功响应(2XX),重定向(3XX),客户端错误(4XX)和服务器错误(5XX)。这些状态码提供了关于请求是否被成功处理的信息。 1. ...

    postman响应状态码

    通过对HTTP响应状态码的理解和运用,可以有效地诊断和解决Web应用程序中出现的各种问题。2xx系列状态码表示成功,3xx系列状态码表示重定向,4xx系列状态码表示客户端错误,5xx系列状态码表示服务器错误。掌握这些...

    http状态码批量查询工具.zip

    5. 分析结果:根据状态码,用户可以识别出哪些URL存在问题,比如404错误表示页面不存在,301或302可能意味着重定向,这在SEO优化中尤其重要,因为它们可能影响搜索引擎的索引和排名。 对于SEO优化而言,批量查询...

    HTTP响应状态码

    了解HTTP响应状态码对于Web开发、故障排查和性能优化至关重要。 在HTTP/1.1协议中,状态码被分为五类: 1. 1XX(临时响应):这些状态码表示临时响应,并且需要请求者继续执行操作。例如,100(继续)状态码表示...

    http状态码详细总结

    该状态码可以用来替代所有301、302状态码。客户端应采用GET方式访问其他地址。 - **304 Not Modified** 服务器端响应304时,不包含任何消息体,因为资源尚未改变,客户端可以继续使用之前缓存的数据。 - **305 ...

    javaweb状态码全集.zip

    这些状态码对于理解Web应用程序的工作原理至关重要,特别是在排查错误和优化性能时。本资源"javaweb状态码全集.zip"包含了JavaWeb开发中可能遇到的所有HTTP状态码,旨在帮助开发者快速查询,无需频繁搜索引擎。 ...

    Java自定义接口状态码.zip

    在Java编程中,自定义接口状态码是一种常见的做法,它有助于提高代码的可读性和维护性,同时也使得系统之间的通信更加清晰。接口状态码通常用于表示一个请求的处理结果,可以是成功、错误或者特定业务状态。下面我们...

    蓝牙常见uuid和gatt状态码

    本篇文章将深入探讨蓝牙中的UUID和GATT(Generic Attribute Profile)状态码,帮助读者理解它们的工作原理和常见应用。 首先,让我们了解UUID。在蓝牙BLE中,服务(Service)是由一个或多个特征(Characteristic)...

    C#获取目标网址http头信息,比如状态码等等信息

    总的来说,C#提供了强大的工具来处理HTTP请求和响应,通过HttpWebRequest和HttpWebResponse类,我们可以轻松获取目标网址的HTTP头信息,包括但不限于状态码。理解并熟练运用这些知识,对于开发高效、可靠的网络应用...

    服务器返回状态码大全

    ### 服务器返回状态码详解 #### 一、概述 服务器返回的状态码是在HTTP通信中用于指示请求结果的一种标准代码。这些状态码可以帮助客户端(如浏览器、搜索引擎爬虫等)了解服务器处理请求的具体情况,以便采取相应...

Global site tag (gtag.js) - Google Analytics