现在有了 HTTPS 服务,但原来的 HTTP 站点也不能马上弃用,还是会有很多网民习惯在地
址栏里直接敲域名(或者是旧的书签、超链接),默认使用 HTTP 协议访问。
所以,我们就需要用到第 18 讲里的“重定向跳转”技术了,把不安全的 HTTP 网址用 301
或 302“重定向”到新的 HTTPS 网站,这在 Nginx 里也很容易做到,使
用“return”或“rewrite”都可以
1
2
return 301 https://$host$request_uri; #
永久重定向
rewrite ^ https://$host$request_uri permanent; #
永久重定向
但这种方式有两个问题。一个是重定向增加了网络成本,多出了一次请求;另一个是存在安
全隐患,重定向的响应可能会被“中间人”窜改,实现“会话劫持”,跳转到恶意网站。
不过有一种叫“
HSTS
”(HTTP 严格传输安全,HTTP Strict Transport Security)的技术
可以消除这种安全隐患。HTTPS 服务器需要在发出的响应头里添加一个“
Strict
Transport-Security
”的字段,再设定一个有效期,例如:
Strict-Transport-Security: max-age=15768000; includeSubDomains
这相当于告诉浏览器:我这个网站必须严格使用 HTTPS 协议,在半年之内(182.5 天)都
不允许用 HTTP,你以后就自己做转换吧,不要再来麻烦我了。
有了“HSTS”的指示,以后浏览器再访问同样的域名的时候就会自动把 URI 里
的“http”改成“https”,直接访问安全的 HTTPS 网站。这样“中间人”就失去了攻击
的机会,而且对于客户端来说也免去了一次跳转,加快了连接速度。