今日读书,无法理解HTTP302、303、307状态码的来龙去脉,决定对其做深究并总结于本文。

《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。

HTTP1.1文档中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的必要了。

本文所在:http://www.cnblogs.com/cswuyg/p/3871976.html

参考资料:

2、RFC1945 http://tools.ietf.org/html/rfc1945#page-34

3、RFC2616 http://tools.ietf.org/html/rfc2616#section-10.3.3

cswuyg @ 2014.7.27

有疑问加站长微信联系(非本文作者)

php 状态码302,HTTP状态码302、303和307的故事相关推荐

  1. http状态码302,303,307的区别

    2019独角兽企业重金招聘Python工程师标准>>> 他们都是重定向 并且有细微的区别,他们的区别主要来源于HTTP/1.0 和HTTP/1.1 应用程序对这些状态码处理方式不同而 ...

  2. 302状态码_http状态码是什么?301 302 404的SEO应用场景

    什么是HTTP状态码?简单的讲,就是用以表示网页服务器HTTP响应状态的3位数字代码.其中1xx表示临时响应,2xx表示成功处理了请求,3xx代表重定向,4xx表示请求错误,而5xx表示服务器错误.除 ...

  3. http状态码301、302、303、307、308区别

    3xx开头的状态码都表示重定向. 先说明一些版本问题, 301和302都是http1.0就定义好的,在http1.1中才新增了 其余的状态码. 301 Moved Permanently 永久重定向 ...

  4. HTTP状态码(重定向/error 301/302)

    1. HTTP状态码 当浏览器访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接受并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的英文为HTTP status Code ...

  5. Http状态码之:301、302重定向

    概念 301 Moved Permanently 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有链接编辑功能的客户端应当自动把请求的地 ...

  6. 301、302、303、307 和 308:这个重定向的状态码都用来干啥的?

    HTTP重定向是引导访问者(用户或者爬虫机器人)从一个URL到另一个URL的方.重定向的使用场景一般有以下几项: URL变更:当内容迁移到新的地址时,你仍然想访问者可以通过旧的链接自动的重定向到新的地 ...

  7. http协议状态码3xx系列(301,302,303,304,305,306,307),小白易通

    3xx 重定向 3xx系列是http响应包中重要的状态标准,表示重定向意义的一类状态码,这些转状态码将指导客户端执行某些行为 都是属于重定向,但不同的值,差异却不小,具体差异如下 301 永久重定向 ...

  8. 常见HTTP状态码(200、301、302、500等)

    HTTP状态码,它是用以表示网页服务器HTTP响应状态的3位数字代码,状态码的第一个数字代表了响应的五种状态之一. 1XX系列:指定客户端应相应的某些动作,代表请求已被接受,需要继续处理.由于 HTT ...

  9. 常见HTTP状态码(200、301、302、500等)解说

    对网站管理工作者来说有个词不陌生,HTTP状态码,它是用以表示网页服务器HTTP响应状态的3位数字代码.状态码的第一个数字代表了响应的五种状态之一. 1XX系列:指定客户端应相应的某些动作,代表请求已 ...

最新文章

  1. 深度学习七个实用技巧
  2. 工业物联网的应用领域与方向
  3. Nginx 路由--Location的使用
  4. ASP.NET在访问Controller的方法带参数时怎样防止黑客攻击
  5. JAVA——基于HttpClient的通过单点登录方式(统一身份认证平台)登录正方教务系统[1999-2020]基本解决方案
  6. 基于WinDbg的内存泄漏分析
  7. Dom4j操作XML
  8. 剑指offer面试题[40]-数组中只出现一次的数字
  9. Spring Data 开发环境搭建(二)
  10. JavaScript:Web APIsDOMBOM
  11. 我与Bootstrap
  12. 已知直角三角形的周长,求可以构成三角形的情况
  13. AirPlay to Mac 如何工作以及使用它需要什么?
  14. Flutter-防京东商城项目-修改默认收货地址 显示默认收货地址-42
  15. 如何将现有Apple ID 更改为美区
  16. http状态404 vscode_HTTP常见状态码(404、400、500)等错误
  17. emule服务器有响应,eMule刚连上服务器就断请教为什么
  18. Golang验证身份证号码是否有效
  19. 企业如何做新闻软文发布? 软文推广和新闻源发布有何不同之处?
  20. 我的第一次知识图谱问答

热门文章

  1. python传文件给java_python使用简单http协议来传送文件
  2. MySQl Got a packet bigger than ' max_allowed_packet' bytes
  3. 打游戏提示计算机丢失,Windows7电脑运行某游戏提示“计算机丢失mxvcp120.dll”怎么办...
  4. linux华为路由器模拟器,华为路由器模拟器与实验内容.doc
  5. MATLAB离散一维小波函数
  6. shell 脚本初步,启动可执行 jar 文件
  7. 订单生产计划表范本_工厂生产管理为什么需要ERP软件?
  8. 关于Ecllipse
  9. 指纹识别工具(CMSeek)
  10. linux cpu负载巡检,linux服务器巡检报告.doc