`
zccst
  • 浏览: 3294964 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HTTP 状态码 30X

阅读更多
作者:zccst

301 永久重定向,告诉客户端以后应从新地址访问.
302 作为HTTP1.0的标准,以前叫做Moved Temporarily ,现在叫Found. 现在使用只是为了兼容性的处理,包括PHP的默认Location重定向用的也是302.
但是HTTP 1.1 有303 和307作为详细的补充,其实是对302的细化
303:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
307:对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。
实际测试:
测试内容:
写一个测试的test.html代码,发起post请求到test.php页面中
test.php页面分别给出3种重定向处理,都跳到test2.php
test2.php打印出post的结果
(至于怎么写..自己查手册吧,PHP发送头很容易.)
....
301 => "HTTP/1.1 301 Moved Permanently",
302 => "HTTP/1.1 302 Found",
303 => "HTTP/1.1 303 See Other",
307 => "HTTP/1.1 307 Temporary Redirect",
....
测试结果:
301,302和303的处理结果是一样的,直接跳转到test2.php,post没有内容
307的会重新post请求到test2.php,并且给出页面提示







今日读书,无法理解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。
    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的必要了。


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
评论

相关推荐

    xcyx.smart

    三菱FX系列PLC编程口通信协议总览 三菱FX系列PLC编程口通信协议总览 该协议实际上适用于PLC编程端口以及 FX-232AW 模块的通信。...5、PLC侧的响应码中"和效验"是指从"站号"到"EXT"之间的各代码的ASCII码的累加

    X-Scan v3.1

    需要“Nessus攻击脚本引擎”源代码、X-Scan插件SDK、示例插件源代码或愿意参与脚本翻译工作的朋友,可通过本站“X-Scan”项目链接获取详细资料:“http://www.xfocus.net/projects/X-Scan/index.html”。 三. 所需...

    X-Scan

    需要“Nessus攻击脚本引擎”源代码、X-Scan插件SDK、示例插件源代码或愿意参与脚本翻译工作的朋友,可通过本站“X-Scan”项目链接获取详细资料:“http://www.xfocus.net/projects/X-Scan/index.html”。 <br>三....

    x86 x64体系探索及编程part1

    11 1.2.4 unsupported 编码值 14 1.2.5 浮点数精度的转换 15 1.2.6 浮点数的溢出 17 1.2.7 BCD 码 20 1.2.8 SIMD 数据 21 第2 章 x86/x64 编程基础 23 2.1 选择编译器 23 2.2 机器语言 24 2.3 Hello world 25 2.3.1...

    x-SCAN -V3.3-CN.

    X-Scan v3.0(beta) -- 发布日期:12/30/2003,对主程序结构进行调整,加入移植的NASL插件,支持2.0.9版本以前的所有NASL脚本;对插件接口做少量修改,方便由其他朋友共同开发插件;对远程操作系统识别功能进行了...

    x86 x64体系探索及编程part4

    11 1.2.4 unsupported 编码值 14 1.2.5 浮点数精度的转换 15 1.2.6 浮点数的溢出 17 1.2.7 BCD 码 20 1.2.8 SIMD 数据 21 第2 章 x86/x64 编程基础 23 2.1 选择编译器 23 2.2 机器语言 24 2.3 Hello world 25 2.3.1...

    强大的扫描工具x-scan

    X-Scan v3.0(beta) -- 发布日期:12/30/2003,对主程序结构进行调整,加入移植的NASL插件,支 持2.0.9版本以前的所有NASL脚本;对插件接口做少量修改,方便由其他朋友共同开发插件;对远程操作 系统识别功能进行...

    x86 x64体系探索及编程 part2

    11 1.2.4 unsupported 编码值 14 1.2.5 浮点数精度的转换 15 1.2.6 浮点数的溢出 17 1.2.7 BCD 码 20 1.2.8 SIMD 数据 21 第2 章 x86/x64 编程基础 23 2.1 选择编译器 23 2.2 机器语言 24 2.3 Hello world 25 2.3.1...

    x86 x64体系探索及编程part3

    11 1.2.4 unsupported 编码值 14 1.2.5 浮点数精度的转换 15 1.2.6 浮点数的溢出 17 1.2.7 BCD 码 20 1.2.8 SIMD 数据 21 第2 章 x86/x64 编程基础 23 2.1 选择编译器 23 2.2 机器语言 24 2.3 Hello world 25 2.3.1...

    Verilog实现的PCM30数据帧群检测代码

    偶数帧的帧同步码为10011011,奇数帧的帧同步码为110XXXXX(X为任意值)。 2.系统初始状态为失步态,失步信号FLOSS输出低电平,电路在输入码流里逐比特搜寻同步码,当搜寻到第一个偶帧同步码后,电路转为逐帧搜寻,...

    手机解锁秘诀-再也不用上营业厅了

     诺基亚省30%电:*#746025625# . M; x: Q7 h, X 飞利浦强迫重连网:*#2562*# 0 O2 l+ N) H+ f6 t 飞利浦显示和更改手机密码:*#7489*# # H8 q% o. r- w) n$ U  博世(BOSCH)909S回中文:*#0852# 9 x! ?$ m: r+ ...

    FP-X用户手册

    1.2.1 FP-X控制单元 ............................................................................................................................. 1.2.2 FP-X扩展单元 .....................................

    SuperNotepad

    Inverse Hyperbolic Cosecant(反双曲余割) HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) +1) / X) Inverse Hyperbolic Cotangent(反双曲余切) HArccotan(X) = Log((X + 1) / (X - 1)) / 2 以 N 为底的对数...

    c++语言代码

    0x30ff,0xf87f,0xf87f,0xfc3f }; long DownNum[16]={ 0x0000,0x7c00,0x6000,0x7000, 0x7800,0x7c00,0x7e00,0x7f00, 0x7f80,0x7e00,0x7c00,0x4600, 0x0600,0x0300,0x0300,0x0180 }; for(i=0;i;i++) ...

    网络安全简答题 2.docx

    23、常见的状态码有哪些? 24、什么是SSL?https是如何保证数据传输的安.… 25、如何保证公钥不被篡改? 26、数字签名的过程 27、什么是网络蠕虫?它的传播途径是什么? 28、X$s盲打到内网服务器的利用 29、鱼叉式...

    hb:快速的http批处理请求工具

    跟随重定向(30x) -redirect 筛选器响应主体 -grep " admin " 筛选器响应标头(X-Powered-By ContentType标题) -filter " nginx " 过滤器响应状态码 -code 2 # 2xx 显示回弹体 -response 随机请求 -random 发送...

    多功能计算器(带公式输入,调色板,进制转换,小数位设定,常用数学公式,逻辑运算(与或非),常用函数(sin,cos等),ASCII码转换等等)

    ESC:显示或隐含扩展输入框 F1: 显现帮助窗口 ESC:关闭帮助窗口 ... (Byte(30)='0') 使用技巧: 各输入框支持鼠标拖曳功能,用鼠标 划过选定复制内容,进行拖曳。放落后 落点在光标所在处 delphi 源码开放

    ESET_VC52_AUTOID精锐id自动获取器(绝对能用!)

    1.7.2.4_x64更新:2009-11-30 1、修正部分用户在自动更新ESET病毒库完成后而无法关闭ESET的问题。 2、解决因内置ID发布页无法打开而在随机模式下可能出现连接不到服务器的问题。 1.7.2.5_x64更新:2009-12-01 1、...

    nod32 id获取器

    1.7.2.4_x64更新:2009-11-30 1、修正部分用户在自动更新ESET病毒库完成后而无法关闭ESET的问题。 2、解决因内置ID发布页无法打开而在随机模式下可能出现连接不到服务器的问题。 1.7.2.5_x64更新:2009-12-01 1、...

Global site tag (gtag.js) - Google Analytics