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 ...
随机推荐
- sed与grep练习题
第1章 练习题 第1题 取得/etc/hosts 文件的权限 如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r-- 为 644,要求使用命令取得644 这样的数字. 方法一 ...
- opencv局限:cv::FileStorage读取中,xml文件的第一层节点不能超过4个
今天测试发现一个问题,cv::FileStorage读取中,xml文件的第一层节点不能超过4个. <?xml version="1.0"?> <opencv_st ...
- Lp距离, L1范数, 和L2范数(转载)
范式可以理解成距离 转载自: https://blog.csdn.net/hanhuili/article/details/52079590 内容如下: 由此可见,L2其实就是欧式距离.工程上,往往不 ...
- svn服务器端程序安装(二)
1.下载 Setup-Subversion-1.8.9-1.msi 2. 双击,一直next (1) 修改安装地址,要求是非中文无空格 3. 安装完成后,检查是否已添加到系统的环境变量PATH中,若没 ...
- zz图像、神经网络优化利器:了解Halide
动图示例实在太好 图像.神经网络优化利器:了解Halide Oldpan 2019年4月17日 0条评论 1,327次阅读 3人点赞 前言 Halide是用C++作为宿主语言的一个图像处理相 ...
- tornado请求与响应
tornado中处理请求与响应的类如下, 所有视图类必须继承该类: tornado.web.RequestHandler 一. 响应之self.write()方法 1. 该方法可返回值的类型: 当返 ...
- Jenkins的简介及安装
Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 1. jenkins就是 ...
- Salesforce 开发整理(八)PDF打印相关
一:基础设置 Salesforce中的PDF页面本质上还是Visualforce[简称VF]页面,所以只需要给VF页面加上一个属性[renderAs="pdf"] 即可生成一个PD ...
- AtCoder Grand Contest 036 简要题解
从这里开始 比赛目录 Problem A Triangle 考虑把三角形移到和坐标轴相交,即 然后能够用坐标比较简单地计算面积,简单构造一下就行了. Code #include <bits/st ...
- js中的require、define、export、import【转】
原文链接:https://www.cnblogs.com/libin-1/p/7127481.html 为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. ...