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 ...
随机推荐
- 快速、优雅的前端IDE之H-builder-X
为什么介绍的是HBuidler-X而不是Hbuilder HX是全新的一个软件,它抛弃了eclipse架构,使用C++为基础架构.HX目前还不能完全替代HBuilder.但在markdown记事的 ...
- python gyp
https://github.com/bnoordhuis/gyp 所以,手动加了这个变量 https://blog.csdn.net/weixin_30576827/article/details/ ...
- react知识点
http://www.cocoachina.com/webapp/20150721/12692.html http://blog.csdn.net/slandove/article/details/5 ...
- 基本 Python 面试问题
目录 1.为什么学习Python? 2.通过什么途径学习的Python? 3.Python和Java.PHP.C.C#.C++等其他语言的对比? 4.简述解释型和编译型编程语言? 5.Python解释 ...
- 不知道多大的文件不要用cat查看!
今天长清女子学校的主任给我微信上发了一图片,说登录服务器的时候就查看了一个文件,结果服务器的风扇忽然变的特别响,系统慢了好多,让我看看是什么回事!我当时心里想,无缘无故怎么会这样,难不成是进病毒了?查 ...
- 201871020225-牟星源《面向对象程序设计(java)》第十三周学习总结
201871020225-牟星源<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- mongo db 去除 _class 字段
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.NoSuc ...
- Oracle工具PLSQL
2018版的PLSQL美化工具在Tools中的PL/SQL Beautifier中 如下:
- Spring IOC小记
1. What IOC (Inversion Of Control,控制反转)与DI(Dependency Injecion,依赖注入) 用于对象间解耦,如在以前若对象A依赖B则需要在A中负责B的创建 ...
- tomcat 指定(自定义)JDK路径的两种方式
1.情景展示 tomcat7使用jdk1.7:tomcat8使用jdk1.8.两个tomcat在一台机器下同时启动,你会发现这两个tomcat使用的是一个版本的jdk, 那就是你配置过的JAVA_ ...