关于 HTTP 307 状态码

leixue 网站策划运营 2017-02-04 10:00:29 阅读(...) 评论(9)

关于各种 HTTP 状态码可以说是虽不曾深入,但也算有所了解,而在写关于什么是 HSTS 安全协议的时候,猛然间发现 不是很常见的 307 状态码,因为我们平常见的都是 301,302,就连 303 就没怎么讲过,而子凡觉得有必要单独的给 307 状态码开个专题讲座。

子凡也作为一个边学变卖的状态来给大家做这个讲座专题吧!首先我们肯定还是先简单的回顾一下常见的:

常见的 HTTP 状态码

302 状态码

POST 请求方式上,客户端收到服务端的 302 状态码,那么不能自动的向新的 URI 发送重复请求,必须跟用户确认是否该重发,因为第二次 POST 时,环境可能已经发生变化(POST 方法不是幂等),POST 操作会不符合用户预期。但是很多浏览器(user agent)在这种情况下都会把 POST 请求变为 GET 请求。

如果客户端发出非 GET、HEAD 请求后,收到服务端的 302 状态码,那么就不能自动的向新 URI 发送重复请求,除非得到用户的确认。但是,很多浏览器都把 302 当作 303 处理了(注意,303 是 HTTP1.1 才加进来的,其实从 HTTP1.0 进化到 HTTP1.1,浏览器什么都没动),它们获取到 HTTP 响应报文头部的 Location 字段信息,并发起一个 GET 请求。

303/307 状态码(这才是我文章要讲的重点)

在 GET、HEAD 这些幂等的请求方式上,302、303、307 没啥区别,而对于 POST 就不同了,大部分浏览器 都会 302 会将 POST 请求转为 GET,而 303 是规范强制规定将 POST 转为 GET 请求,请求地址为 header 头中的 Location,307 则不一样,规范要求浏览器继续向 Location 的地址 POST 内容。

而在 HSTS 中,307 可以被缓存,缓存时间根据 max-age 而定,一般建议缓存 1 年甚至更长。

写在最后

303 和 307 是 HTTP1.1 新加的服务器响应文档的状态码,它们是对 HTTP1.0 中的 302 状态码的细化,主要用在对非 GET、HEAD 方法的响应上。文档规定:浏览器对 303 状态码的处理跟原来浏览器对 HTTP1.0 的 302 状态码的处理方法一样;浏览器对 307 状态码处理则跟原来 HTTP1.0 文档里对 302 的描述一样。

303 和 307 的存在,归根结底是由于 POST 方法的非幂等属性引起的。

子凡也是作为一个边学变卖的状态来给大家做的这个讲座专题,一方面是自己做个记录,另一方面就是也给大家同样的学习和了解一下,虽然很多时候都不会见到,但是学习永无止境嘛!哈哈哈

除非注明,否则均为泪雪博客原创文章,禁止任何形式转载

本文链接:https://zhangzifan.com/http-307-code.html

发表评论

登录 后参与评论
  1. X1BE
    1楼
    X1BE 2个月前 (06-14)

    刚看了一个状态码是307不知道什么意思,查一下~感谢凡哥解答。

    • 张子凡
      张子凡 2个月前 (06-14)
      回复 @X1BE :307主要是在开发中可能遇到的会多一点,正常用户情况基本比较少遇到。
  2. kyle
    2楼
    kyle 4个月前 (04-20)

    现在评论都要带审核,哈哈

    • 张子凡
      张子凡 4个月前 (04-22)
      回复 @kyle :为保证对评论的监控,每一条评论都需要我查看后或回复后才会展现。
  3. kyle
    3楼
    kyle 4个月前 (04-20)

    不错!

  4. 去流浪
    4楼
    去流浪 1年前 (2018-06-20)

    扫盲式教育,期待更深入的文章

  5. rush my essay
    5楼
    rush my essay 2年前 (2017-03-06)

    支持楼主

  6. 明月登楼的博客
    6楼
    明月登楼的博客 3年前 (2017-02-08)

    学习了,不错,留个脚印支持一下!