全站HTTPS第三篇:Nginx 80端口自动转发到443端口

2018-02-09 20:21:29 +0800

以前在访问网站的时候,偶尔有一些疑惑。

1、为什么同一个网站使用3级域名(带www.)可以访问,使用2级域名(不带www.)不能访问,反之亦然。例如:www.net.cn  可以访问,net.cn 就不能访问。有的网站却都可以访问,如 www.ibm.com 或者 ibm.com 。(请使用IE或edge浏览器测试,不要使用google浏览器)

2. 有的网站其3级域名(www.)和2级域名都可以访问,在登录后浏览某个本站链接,发现提示又要登录。

 

       你是否也意识到此类问题,想过为什么是这样吗?作为一个计科人查阅资料搞清楚域名分类、域名解析、cookie管理和各浏览器差异性后,拨云见日疑惑自然消失了。怎么跟普通用户科普?除了这些,难道还要科普HTTP、HTTPS吗?

用户:这么复杂,网站不是 www...吗? 为什么要有4个网址。

1)http://commsg.com

2)http://www.commsg.com

3)https://commsg.com

4)https://www.commsg.com

 

      对比科普,还是来简单一点的吧。沿袭WWW的辉煌历史的惯性,并且全站HTTPS,决定将所有的访问都跳转到 https://ww.commsg.com 。这样的需求,我们要解决2个问题,80端口跳转到443端口和域名间跳转。这对于Nginx来说驾轻就熟,只需要简单配置即可。通过rewrite permanent将上面的域名1)、2)和3)进行301永久重定向到4)。另外,域名解析部分见第一篇。

 

server {

        listen      80;

        server_name  www.commsg.com;

        charset utf-8;

        rewrite ^(.*)$ https://${server_name}$1 permanent;

    }

    

    server {

        listen      80;

        server_name  commsg.com;

        charset utf-8;

        rewrite ^(.*)$ https://www.${server_name}$1 permanent;

    }

 

    server {

        listen      443 ssl;

        server_name  www.commsg.com;

        charset utf-8;

        ssl on;

        ssl_certificate      d:/nginx-1.12.2/conf/cert/123456789.pem;

        ssl_certificate_key  d:/nginx-1.12.2/conf/cert/123456789.key;

        ssl_session_cache    shared:SSL:1m;

        ssl_session_timeout  5m;

        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_prefer_server_ciphers  on;

        

        access_log d:/log/commsg.access.log;

 

        location / {

            proxy_set_header Host $host;

            proxy_set_header X-Real-Ip $remote_addr;

            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://localhost:8080/;

            proxy_read_timeout 180s;

            break;

        }

    }

   

    server {

        listen      443;

        server_name  commsg.com;

        charset utf-8;

        rewrite ^(.*)$ https://www.${server_name}$1 permanent;

    }

 

Tips:

请注意保证最后2个server的前后顺序,否则因为找不到CA证书问题,导致不能访问。当然你也可以把他们合并一起,例如:

 

server {

        listen      443 ssl;

        server_name  commsg.com www.commsg.com;

        charset utf-8;

        ssl on;

        ssl_certificate      d:/nginx-1.12.2/conf/cert/123456789.pem;

        ssl_certificate_key  d:/nginx-1.12.2/conf/cert/123456789.key;

        ssl_session_cache    shared:SSL:1m;

        ssl_session_timeout  5m;

        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_prefer_server_ciphers  on;

        

        access_log d:/log/commsg.access.log;

 

        if ($http_host !~ "^www.commsg.com$") {

          rewrite  ^(.*)    http://www.commsg.com$1 permanent;

        }

 

        location / {

            proxy_set_header Host $host;

            proxy_set_header X-Real-Ip $remote_addr;

            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://localhost:8080/;

            proxy_read_timeout 180s;

            break;

        }

    }

 

全站HTTPS共3篇:

全站HTTPS第一篇:Nginx配置HTTPS

全站HTTPS第二篇:Nginx SSL集群中request.getScheme() 取不到HTTPS协议

全站HTTPS第三篇:Nginx 80端口自动转发到443端口