Nginx下强制使用HTTPS

如果说2015年是静态博客的发展年,那2016年绝对是https的发展年。去年开始,由于提供免费的SSL证书服务越来越多,全站HTTPS化俨然成为博客界的时尚之举。另一方面Apple强制要求ATS,Google从Chrome56开始,输入密码或者信用卡资料的网站使用HTTPS,将被Chrome浏览器标识为不安全,这已经意味着全站HTTPS时代已经来临。从某种意义上来说,开放的Let’s Encrypt免费证书加快推进了国内HTTPS的发展。

前不久看到又拍云支持https服务后,心痒难耐。春节假期刚好空闲在家,于是干脆动手把边走边说全站升级为https。我使用的是Nginx,在升级的过程中,跳转的问题一直没有得到解决,网上的各种教程,更多的只是提醒了HTTP强制HTTPS访问,并没有解决HTTPS下WWW之间的跳转。可能说的不是很清楚,来,我们理一下。

  1. https://www.huaqing.org
  2. http://www.huaqing.org
  3. https://huaqing.org
  4. https://www.huaqing.org

访问边走边说一共会有以上四种形式,但是我最终的目的是将1、2、3种强制跳转到第4种。通过以下两步也可以实现:

STEP1:将HTTP请求强制跳转到HTTPS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server
{
listen 80;
server_name huaqing.org www.huaqing.org;
return 301 https://www.huaqing.org$request_uri;
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log off;
}

STEP2:将https://huaqing.org请求跳转到https://www.huaqing.org

1
2
3
4
5
6
7
8
9
10
server
{
listen 443 ssl http2;
server_name huaqing.org;
return 301 https://www.huaqing.org$request_uri;
ssl_certificate /etc/letsencrypt/live/www.huaqing.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.huaqing.org/privkey.pem;
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
access_log off;
}