之前看到有V有发了用
https://www.ssllabs.com 等检测工具检测你的网站并优化设置的帖子,于是也把自己的网站弄了一下。弄完之后除了因为证书书SHA1签名以外,都是合格的,成功搞了一个A+的分,还挺高兴的。。。
然后,今天登陆了一下后台发了一篇新文章,然后问题就来了。
之前我的博客设计的是只有后台走HTTPS,前台访问不强制HTTPS。但是在我发完文章之后我发现无论我怎么弄,前台也都会走HTTPS。为了解决这个问题,我排查了一晚上,关了各种插件,搭了一个全新的WP进行尝试,一直都没发现问题所在。
最后,在用Google Chrome Canary的时候发现了问题,在Chrome Canary的开发者控制台中,会看到访问http://xxxxx.xxx的请求直接被307了,而Response Headers一栏赫然写着:
Non-Authoritative-Reason:HSTS
这一下让我想到了问题所在。HSTS指的是HTTP Strict Transport Security,可以理解为服务器告诉浏览器这个网站支持HTTPS,以后的访问都给我强制转到HTTPS上去,不准使用HTTP。于是将apache的设置中的
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
改成
Header always set Strict-Transport-Security "max-age=1; includeSubDomains"
然后再访问一下HTTPS的链接,然后等待这个Header在浏览器中过期,就可以正常的访问非HTTPS的网站了。
然后来说说为啥我说这玩意坑:
1.目前就我的测试来看,没有任何一个浏览器的安全模式会隔离这个HSTS头,比如Google,Google Dev分支,FireFox,Safari等。也就是说,如果你一不小心在安全模式中访问了HTTPS的网站设置了这个头,非安全模式也受影响,反之亦然。这直接导致我在网站本事查了几个小时问题,因为我天真的认为安全模式应该不会出现这个问题。
2.目前就我的测试来看,只有Chrome Canary的开发者控制台会显示Non-Authoritative-Reason:HSTS,别的浏览器包括Chrome的Stable分支,不会显示这个Response Header,你能看到的就是你访问http://
xxx.xxx,然后莫名其妙的被307了。什么原因都没有。这也是我在服务器查了半天没找到问题,看了httpd的access.log才发现这个请求根本没到服务器。
3.目前就我的测试来看,在浏览器中清除这个头的方法最有效的是重置整个浏览器,删除所有本地数据。CTRL+F5啊打开开发者控制台禁用Cache啊什么的完全不好使,没有效果。
4.对于使用了强制前台HTTP的网站来说,比如我的博客,这个头可能会直接导致重定向循环。因为浏览器死活要把你307到HTTPS,但是博客死活要把你307到HTTP,然后就循环了,导致网页打不开。
5.最诡异的是有时候还会遇到访问前几个页面都是好的,都是走的HTTP,然后突然一下点了一个链接就跑到HTTPS上去了。这个现象直接导致我认为是WP Super Cache的问题,在这上耽误了不少时间。
基本上就这5个坑,如果有V友遇到了类似情况,可以先从我说的这点查起,看看是否是跟我一样的情况~
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/143122
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.