如何在Nginx上正确处理非www到www和http到https重定向作为代理?

时间:2016-10-17 17:05:29

标签: nginx proxy ubuntu-16.04 lets-encrypt

我正在尝试为单个域实施这些规则,而我似乎无法找到在线进行此操作的正确方法:

  • 如果用户点击http,则重定向到https://www.domain.com
  • 如果用户点击非www,则重定向到www
  • 如果用户点击https://www.domain.com使用端口
  • 处理特定IP的代理

到目前为止,这就是我所拥有的:

server {
        listen 80;
        server_name domain.io www.domain.io;
        return 301 https://www.domain.io$request_uri;
}


server {
        listen 443 ssl;
        server_name www.domain.io;

        ssl_certificate /etc/letsencrypt/live/domain.io/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domain.io/privkey.pem;

        #MORE SSL BLOCKS


        #remnants, should I remove this?
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name _;

        location / {
                proxy_pass http://IP_ADDR:3000;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }

}

我尝试在两个服务器块之间添加它。

server {
        listen 443;
        server_name domain.io;
        return 301 https://www.domain.io$request_uri;
}

这会以某种方式破坏非www上的SSL。

第一个块有效,就像我想象的那样。未指定协议重定向到https,但非www仍重定向到非www。

网络不是我的专长,所以请原谅任何错误的术语。

1 个答案:

答案 0 :(得分:0)

对于那些需要解决方案的人,我通过理查德史密斯在评论中提出的建议来解决问题。我在我的网站上使用了Let的加密密钥,因此您只需要在listen 443上复制ssl证书行以获取非www阻止。

server {
        listen 80;
        server_name domain.io www.domain.io;

        return 301 https://www.domain.io$request_uri;
}

server {
        listen 443;
        server_name domain.io;

        ssl_certificate /etc/letsencrypt/live/domain.io/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domain.io/privkey.pem;

        #SSL_BLOCK

        return 301 https://www.domain.io$request_uri;
}

server {
        listen 443 ssl;
        server_name www.domain.io;

        ssl_certificate /etc/letsencrypt/live/domain.io/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domain.io/privkey.pem;

        #SSL_BLOCK


        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                proxy_pass http://IP_ADDR:PORT;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }

}