http 307重定向
刚才在做hexo页面优化,发现了本地测试返回http 307。以前没见过这个响应码,于是做一下调研。

相关文章:
http 307
在rfc规范中,http 307 Temporary Redirect 是临时重定向。
平时常见的重定向是:
- 301:Permanently Moved,永久重定向
- 302:Temporarily Moved,临时重定向
http 307和302的区别在于:307要求客户端不改变原先的请求方法,对在Location头部中规定的URI进行访问。对于302,很多客户端的实现是,直接使用GET方式访问重定向地址。
例子
客户端请求
1 |
POST /index.php HTTP/1.1 |
服务器端响应
1 |
HTTP/1.1 307 Temporary Redirect |
那么客户端必须以POST方式重定向访问https://www.example.org/。
本地测试产生http 307
next的_config.yml配置
1 |
# Internal version: 2.1.5 & 3.5.7 |
平时写url地址,一般是http或者https,但是next里面的例子都是//。
//的意义是,沿用当前页面的协议。如果当前页面是http协议,那么发出去的请求就是http;如果是当前页面是https,那么发出去走https。//写法的好处是,不需要关注协议,只需要关注URI路径。如果哪一天发生协议变更,比如http升级为全站https,那么代码完全都不用修改。
但是这没有解释为什么返回了http 307。

仔细看看response header,除了Location指示重定向地址外,还有
1 |
Non-Authoritative-Reason: HSTS |
HSTS是HTTP严格传输安全(英语:HTTP Strict Transport Security),之前的文章提到过:
因为本地测试,使用http://localhost:4000访问,所以//的页面协议是http。但是cloudflare.com开启了HSTS,所有请求都必须是https协议。对cloudflare.com原来的http请求必须升级为https。
事实上,这个307响应不是cloudflare.com产生的,是chrome浏览器干的好事。
The way Chrome shows this in the network tab is by creating a dummy 307 response with a redirect to the https version of the address. But that’s a fake response and is not generated by the server - the reality is Chrome did that internally before the request even went to the server.
注意到,rfc定义http 307是Temporary Redirect,而截图显示的是Internal Redirect。 回想到HSTS只在第1次http访问之后才会生效。如果chrome不做这个返回,会是怎样的流程呢:
- 本地客户端http方式访问cloudflare.com
- 服务器表示要以https方式访问资源
- 于是本地客户端以https方式再次访问cloudflare的资源
中途多了一次网络请求。
因为chrome维护了一份HSTS站点列表,知道cloudflare必须要https方式请求。于是截获http请求后,直接以https方式访问,同时做出dummy 307响应。
小实验
把next的_config.yml从//修改为https://,再测试

直接就是http 200了。
小结
//比写死具体http、https更加灵活,推荐使用- http 307 Temporary Redirect,临时重定向,客户不能改变请求方式
- chrome知道HSTS站点,会自动把这些站点的http请求改写为https,同时在response header增加
Non-Authoritative-Reason: HSTS,并且把307响应码解析为Internal redirect
本文作者ycwu314,备份地址 https://ycwu314.github.io/p/http-307/
http 307重定向的更多相关文章
- http 303 307 302 状态码理解
最近在看 <<the rails4 way>> 书中提到了这几个状态码,网上搜到几篇文章 http://www.cnblogs.com/cswuyg/p/3871976.htm ...
- HSTS 与 307 状态码
最近线上产品突然在 Chrome 浏览器上出现 307 状态码,并跳转到 https 版.由于 https 尚未部署完毕,导致了相当严重的后果. 但是 307 代码是什么含义呢?页面又为何会出现 30 ...
- http协议
什么是协议 是指关于计算机通信的一整套规则,是为完成计算机网络通信而制订的规则.约定和标准. http协议是众多通信协议中的一种,超文本传输协议 (HTTP-Hypertext transfer pr ...
- Fiddler 抓包工具总结
阅读目录 1. Fiddler 抓包简介 1). 字段说明 2). Statistics 请求的性能数据分析 3). Inspectors 查看数据内容 4). AutoResponder 允许拦截制 ...
- fiddler抓包工具1
名称 含义 # 抓取HTTP Request的顺序,从1开始,以此递增 Result HTTP状态码 Protocol 请求使用的协议,如HTTP/HTTPS/FTP等 Host 请求地址的主机名 U ...
- http学习笔记一
- ASIHTTPRequest使用指南---<<翻译稿>>
ASIHTTPRequest使用指南---<<翻译稿>> 当第一次使用ASIHTTPRequest进行http请求时,会出现非常多的bug提示.查了一些资料,发现在少倒入了几个 ...
- 抓包工具 - Fiddler(详细介绍)
Fiddler的详细介绍 一.Fiddler与其他抓包工具的区别 1.Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要 ...
- 用HTTP状态码实现提交表单后刷新页面不重复提交
正常情况下,表单提交后如果用户刷新页面会重复提交表单,有些情况下我们不希望表单重复提交,利用HTTP协议中的307状态码重定向页面可以实现这个目的.实例如下: 表单页面代码: <form act ...
随机推荐
- vue导出文件下载
项目当中有用到文件的导出功能,以此来总结 request({ /*url: this.exportUrl,*/ url: `************`, method: "GET" ...
- Rust中的函数调用
注意区别语句和表达式哟. Rust是一门基于表示式的语言,牢记!!! fn main() { println!("Hello world!"); another_function( ...
- visual studio之X64调试问题
这个问题没有解决. 只能X86啦!
- echo和printf打印输出
[root@node2 scprits]# echo Hello World! Hello World! [root@node2 scprits]# echo 'Hello World!' Hello ...
- Linux 怎样更改locale语言设置
推荐使用UTF8编码,因为这是国际标准,能兼容任何语言的编码.在CentOS VPS下修改语言编码: localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 export ...
- Excel-查找函数
1.VLOOKUP函数 该函数的语法规则如下: VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) 多表关联查询---vlooku ...
- tornado模板的使用
一. 配置模板路径 settings中使用template_path来指定模板的路径, 实例化服务对象时加载进去即可. 二. 模板的使用 1. 使用self.render()方法可返回指定的html页 ...
- [LeetCode] 436. Find Right Interval 找右区间
Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...
- DingTalk钉钉消息推送(.net core 3 WebApi尝鲜记)
我发了个朋友圈,Swagger真他妈的牛B,解放了开发API的码农,麻麻再也不用担心我们写API文档耽误回家吃饭了. /// <summary> /// 发送钉钉消息 /// </s ...
- 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (三)
本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...