你所不知道的 HSTS

你所不知道的 HSTS

你所不知道的 HSTS

2015/10/24 · 美高梅59599,HTML5 ·
HSTS

原文出处:
李靖(@Barret李靖)   

很多人听说过也看到过 301、302,但是几乎从来没有看到过 303 和 307
的状态码。今天在淘宝首页看到了 307 状态码,于是摸索了一把。

nginx如何配置HSTS

在nginx的配置中,在https的server站点添加如下头部:

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

这样当第一次以https方式访问我的网站,nginx则会告知客户端的浏览器,以后即便地址栏输入http,也要浏览器改成https来访问我的nginx服务器。是不是很爽,服务器再也不管http转发到https这档子事了,由浏览器自己把http改名字为https再来请求服务器,这不就减少了访问服务器的次数了吗,节省了不少资源。

实测效果,重启nginx后,第一次访问用了http,发现没有跳转。当然不跳了,人家HSTS生效是要你访问https才生效的。然后输入了https的网址,下来再重新输入http,神奇了,真的浏览器自己替换成了https,再试试依然会替换,看我的配置,大概会维持63072000s吧,哈哈。

如果用户第一次访问是http,以后还是http,就是不用一次https,那我们岂不是一直不能是的HSTS生效了?所以这里再加个配置,在http站点的server下,添加配置

return 301 https://$host;

这样当客户端访问http的时候,nginx就给他转到https上去,那访问了一次https后,以后浏览器自己就往https上转了,发到nginx的也就是https的请求了!

另外如果为了避免点击劫持,还要添加 X-Frame-Options
头部,确保不会嵌入到frame 或 iframe,使得网站的内容不会嵌入到其他网站。

add_header X-Frame-Options "DENY";

小结

本文简单说明了 HSTS 的基本原理和相关内容,他在全站 https
下有一个较大的正向作用,推荐使用。

P.S:在 Chrome
中打开 chrome://net-internals/#hsts,添加域名之后,可以让浏览器强制对该域名启用
https,所有的 http 请求都会内部转到 https。

1 赞 收藏
评论

美高梅59599 1

302跳转

通常将 HTTP 请求 302 跳转到 HTTPS,但有问题:

1.不安全,302 跳转会暴露用户访问站点,易被劫持。

2.多增加一次访问,使得客户端响应速度慢。302 跳转需要一个 RTT(The role
of packet loss and round-trip time),浏览器执行跳转也需要时间。

307 状态码

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

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

浏览器支持

Chromium和Google Chrome从4.0.211.0版本开始支持HSTS

Firefox 4及以上版本

Opera 12及以上版本

Safari从OS X Mavericks起

Internet Explorer从Windows
10技术预览版开始支持,之后微软又向IE11用户推送了支持HSTS的更新。

admin

网站地图xml地图