作者: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的必要了。
如果您觉得本文的内容对您的学习有所帮助,您可以微信:
分享到:
相关推荐
6. **跟随重定向**:`-L`或`--location`选项让`curl`自动处理服务器返回的HTTP状态码30x重定向。 7. **HTTP认证**:`-u`或`--user`用于提供用户名和密码进行HTTP基本认证,如`curl -u username:password ...
对于vivo x30、X27和X23系列手机的用户,如果遇到了这样的问题,可以采取刷机解锁的方式来解决。本文将详细介绍如何通过刷机来解除屏幕锁定,并提供必要的固件、系统解锁工具和驱动软件。 首先,我们需要了解刷机的...
3. **重定向**:HTTP状态码30x系列(尤其是301永久重定向和302临时重定向)被用来告诉浏览器或其他客户端资源的位置已经改变。在Django中,可以通过`HttpResponseRedirect`对象或`reverse()`函数实现重定向。 4. **...
在环境适应性方面,LR1000X可以在-30~65°C的温度范围内稳定工作,耐受5%~95%的湿度(无冷凝),确保在各种气候条件下都能保持良好性能。 总的来说,LR1000X是一款高性能、多功能的条码扫描模组,适用于各种需要...
三菱FX系列PLC编程口通信协议总览 三菱FX系列PLC编程口通信协议总览 该协议实际上适用于PLC编程端口以及 FX-232AW 模块的通信。...5、PLC侧的响应码中"和效验"是指从"站号"到"EXT"之间的各代码的ASCII码的累加
- **P2.0**: 数字可编程IO引脚,连接状态下拉低此引脚可进入AT命令模式。 - **P1.7~P0.0**: 这些引脚均为数字可编程IO引脚,其中P0.3可用作串口发送引脚TX,P0.2可用作串口接收引脚RX。 #### 七、机械尺寸与安装...
CDMA2000-1x 是一种第三代(3G)移动通信标准,主要用于提供语音和数据服务。这种技术基于码分多址(Code Division Multiple Access)原理,允许多个用户在同一频段上同时通信,通过独特的编码序列区分不同的信号。...
### 实例30-EEPROM(X5045)接口及驱动程序 #### 概述 本实例介绍了如何实现对EEPROM (X5045) 的接口设计及其驱动程序编写。EEPROM (Electrically Erasable Programmable Read-Only Memory) 是一种非易失性存储器,...
X-Scan v3.0(beta) -- 发布日期:12/30/2003,对主程序结构进行调整,加入移植的NASL插件,支 持2.0.9版本以前的所有NASL脚本;对插件接口做少量修改,方便由其他朋友共同开发插件;对远程操作 系统识别功能进行...
X-Scan v3.0(beta) -- 发布日期:12/30/2003,对主程序结构进行调整,加入移植的NASL插件,支持2.0.9版本以前的所有NASL脚本;对插件接口做少量修改,方便由其他朋友共同开发插件;对远程操作系统识别功能进行了...
需要“Nessus攻击脚本引擎”源代码、X-Scan插件SDK、示例插件源代码或愿意参与脚本翻译工作的朋友,可通过本站“X-Scan”项目链接获取详细资料:“http://www.xfocus.net/projects/X-Scan/index.html”。 三. 所需...
需要“Nessus攻击脚本引擎”源代码、X-Scan插件SDK、示例插件源代码或愿意参与脚本翻译工作的朋友,可通过本站“X-Scan”项目链接获取详细资料:“http://www.xfocus.net/projects/X-Scan/index.html”。 <br>三....
- 命令码:表示不同的操作指令。 - 数据长度:指示数据字段的字节数。 - 数据字段:具体的数据内容。 - 校验和:用于验证数据完整性。 - 结束位:固定值0xEF。 - **命令集**: - 初始化模块。 - 获取设备...
- 添加DHCP角色, 不启用WINS, 禁用IPv6无状态模式。 - 创建DHCP作用域时, 配合交换机进行创建, 以便根据用户组分配不同的IP地址。 4. **安装证书服务:** - 默认设置完成安装。 5. **创建AD对象:** - 建立组织...
低功耗模式的设计使得BQ30Z5x 在非活动状态下能够大幅度降低功耗,这对于延长电池寿命至关重要。 ##### 3. 先进的充电算法 先进的充电算法能够确保电池在最短时间内得到最大化的充电效果,同时减少因充电过程中的...
兰宝公司生产的LR30X系列增强远距离型金属圆柱形AC 2线电感式传感器是一种工业自动化领域中广泛使用的检测设备。该系列传感器在设计上具有以下特点: 1. 增强的检测距离:与标准型电感传感器相比,LR30X传感器系列...
"F30x_F3x0_F403_解除写保护.7z"这个压缩包文件似乎包含了针对这个问题的解决方案。 GD32F330的写保护功能是设计用来防止意外的编程或擦除操作,以保护存储在闪存中的代码不被篡改。当MCU处于写保护状态时,通常...
- 使用选定的方法平衡仪器(如柱子和检测器),直到基线稳定且各模块均处于就绪状态。 **4. 运行样品** - **单个样品运行**: 在“单个样品”功能区填写样品相关信息并运行。 - **序列样品运行**: - 在“序列”...
- FX1N/FX1X:`02 30 38 30 30 38 30 38 03 36 42` #### 步骤3:发送通信命令 在多串口调试程序中输入上述的通信命令,向PLC发送请求。当PLC收到命令后,它会将密码以明文形式返回给编程器(电脑)。 #### 步骤4...