Rootop 服务器运维与web架构

通过HSTS实现浏览器自动跳转https(非服务器响应跳转)

nginx中关于hsts资料:https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/

全称 HTTP Strict Transport Security

HSTS目的是让浏览器在访问网站的时候浏览器内部自动实现https协议访问(不需要服务器告诉浏览器跳转https)。
在没有hsts功能时,需要自己在nginx里配置http跳转https。
但是这样每个请求(可能)都需要nginx告诉浏览器你访问的地址需要跳转到https,这样就浪费了时间。

hsts需要在第一次访问https时,服务器返回一个指定的响应头,用于告诉浏览器你可以用hsts功能。
然后后续的访问都会自动走https,而不需要跳转了(浏览器内部自己跳转,下面会说)。

nginx配置:

# 首先配置 http跳转https
if ($scheme = http) {
	return 301 https://$host$request_uri;
}

# 添加hsts响应头,可以在server{}段,或者location中。

add_header Strict-Transport-Security "max-age=86400; includeSubdomains; preload";

# 参数解释
max-age # 必选参数,告诉浏览器在多少秒内一直用https (关闭浏览器不会失效、刷新页面会延长失效时间)
includeSubdomains # 可选参数,包括子域名
preload # 可选参数,使用HSTS预加载列表,在nginx文档有说明

这里就不演示我自己的站了(HK的机器https不稳定)。
我们来看百度的首页

第一次访问http协议的百度首页,百度响应头里回应了需要跳转到https。

第二次访问https,响应头里有Strict-Transport-Security参数,生命周期是172800秒,也就是48小时。也就是在放着当前页面不动的情况下,48小时内刷新页面,或者关掉浏览器重新访问百度,都会自动访问https。

关掉浏览器,重新打开百度

第一次发起http协议访问,看到状态码是 307 internal redirect ,307内部跳转,这就是浏览器内部自己实现的,没有通过服务器来返回location头跳转。

第二个请求就直接https协议访问服务器了。

chrome浏览器里可以通过访问: chrome://net-internals/#hsts 搜索支持的域名。

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/4514.html

作者:Venus

服务器运维与性能优化

评论已关闭。