`
zccst
  • 浏览: 3322634 次
  • 性别: 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的必要了。


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

相关推荐

    curlcurlcurlcurl

    6. **跟随重定向**:`-L`或`--location`选项让`curl`自动处理服务器返回的HTTP状态码30x重定向。 7. **HTTP认证**:`-u`或`--user`用于提供用户名和密码进行HTTP基本认证,如`curl -u username:password ...

    vivo x30 X27 X23有密码如何解锁教你刷机解锁强制清除屏幕锁的刷机包固件系统解锁平台驱动软件了.zip

    对于vivo x30、X27和X23系列手机的用户,如果遇到了这样的问题,可以采取刷机解锁的方式来解决。本文将详细介绍如何通过刷机来解除屏幕锁定,并提供必要的固件、系统解锁工具和驱动软件。 首先,我们需要了解刷机的...

    django-internal-redirects

    3. **重定向**:HTTP状态码30x系列(尤其是301永久重定向和302临时重定向)被用来告诉浏览器或其他客户端资源的位置已经改变。在Django中,可以通过`HttpResponseRedirect`对象或`reverse()`函数实现重定向。 4. **...

    LR1000X 扫码头文档

    在环境适应性方面,LR1000X可以在-30~65°C的温度范围内稳定工作,耐受5%~95%的湿度(无冷凝),确保在各种气候条件下都能保持良好性能。 总的来说,LR1000X是一款高性能、多功能的条码扫描模组,适用于各种需要...

    xcyx.smart

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

    cc254x蓝牙模块说明书

    - **P2.0**: 数字可编程IO引脚,连接状态下拉低此引脚可进入AT命令模式。 - **P1.7~P0.0**: 这些引脚均为数字可编程IO引脚,其中P0.3可用作串口发送引脚TX,P0.2可用作串口接收引脚RX。 #### 七、机械尺寸与安装...

    CDMA2000-1x呼叫流程

    CDMA2000-1x 是一种第三代(3G)移动通信标准,主要用于提供语音和数据服务。这种技术基于码分多址(Code Division Multiple Access)原理,允许多个用户在同一频段上同时通信,通过独特的编码序列区分不同的信号。...

    实例30-EEPROM(X5045)接口及驱动程序

    ### 实例30-EEPROM(X5045)接口及驱动程序 #### 概述 本实例介绍了如何实现对EEPROM (X5045) 的接口设计及其驱动程序编写。EEPROM (Electrically Erasable Programmable Read-Only Memory) 是一种非易失性存储器,...

    强大的扫描工具x-scan

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

    x-SCAN -V3.3-CN.

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

    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>三....

    SFG R30X系列指纹识别模块用户手册

    - 命令码:表示不同的操作指令。 - 数据长度:指示数据字段的字节数。 - 数据字段:具体的数据内容。 - 校验和:用于验证数据完整性。 - 结束位:固定值0xEF。 - **命令集**: - 初始化模块。 - 获取设备...

    windows NPS 结合 Cisco 交换机实现802.1x身份验证

    - 添加DHCP角色, 不启用WINS, 禁用IPv6无状态模式。 - 创建DHCP作用域时, 配合交换机进行创建, 以便根据用户组分配不同的IP地址。 4. **安装证书服务:** - 默认设置完成安装。 5. **创建AD对象:** - 建立组织...

    BQ30Z50 & 55 DataSheet

    低功耗模式的设计使得BQ30Z5x 在非活动状态下能够大幅度降低功耗,这对于延长电池寿命至关重要。 ##### 3. 先进的充电算法 先进的充电算法能够确保电池在最短时间内得到最大化的充电效果,同时减少因充电过程中的...

    兰宝 LR30X AC2-Y增强远距离型金属圆柱形系列-AC 2线电感式传感 说明书.pdf

    兰宝公司生产的LR30X系列增强远距离型金属圆柱形AC 2线电感式传感器是一种工业自动化领域中广泛使用的检测设备。该系列传感器在设计上具有以下特点: 1. 增强的检测距离:与标准型电感传感器相比,LR30X传感器系列...

    Openlab-2.x用户现场培训教程.pdf

    - 使用选定的方法平衡仪器(如柱子和检测器),直到基线稳定且各模块均处于就绪状态。 **4. 运行样品** - **单个样品运行**: 在“单个样品”功能区填写样品相关信息并运行。 - **序列样品运行**: - 在“序列”...

    F30x_F3x0_F403_解除写保护.7z

    "F30x_F3x0_F403_解除写保护.7z"这个压缩包文件似乎包含了针对这个问题的解决方案。 GD32F330的写保护功能是设计用来防止意外的编程或擦除操作,以保护存储在闪存中的代码不被篡改。当MCU处于写保护状态时,通常...

    读取三菱PLC密码的方法

    - FX1N/FX1X:`02 30 38 30 30 38 30 38 03 36 42` #### 步骤3:发送通信命令 在多串口调试程序中输入上述的通信命令,向PLC发送请求。当PLC收到命令后,它会将密码以明文形式返回给编程器(电脑)。 #### 步骤4...

Global site tag (gtag.js) - Google Analytics