Nginx redirect http://www and naked http/https to https://www

前端 未结 4 982
暖寄归人
暖寄归人 2021-01-02 12:16

I would like to redirect all traffic from the following domains:

  • http://domain.com
  • http://www.domain.com
  • http
相关标签:
4条回答
  • 2021-01-02 12:59

    Following will help.

    server {
                listen 80;
                listen [::]:80;
                server_name example.com www.example.com;
    
    
                return 301 https://www.example.com$request_uri;
        }
    
      server {
                listen 443 ssl http2;
                listen [::]:443 ssl http2;
                server_name example.com;
                return 301 https://www.example.com$request_uri;
       }
    
    server {
                listen 443 ssl http2;
                listen [::]:443 ssl http2;
                server_name www.example.com;
    
       ====>>> Your site configuratioin Goes here <<======
    }
    
    0 讨论(0)
  • 2021-01-02 13:01

    Provide a specific server block for the naked domain along with a general default. The more-specific ones will be used first.

        server {
                listen 80;
                listen [::]:80;
                listen 443 ssl http2;
                listen [::]:443 ssl http2;
                server_name example.com;
    
                return 301 https://www.$host$request_uri;
        }
        server {
                listen 80 default_server;
                listen [::]:80 default_server;
    
                return 301 https://$host$request_uri;
        }
        server {
                listen 443 ssl http2;
                listen [::]:443 ssl http2;
                server_name www.example.com;
                # omitting the rest for https://www.example.com
        }
    

    I use Let's Encrypt for my certificates so something like the following for default_server prevents redirecting the ACME challenges (note the second wildcard server_name for handling all https://*.example.com which don't have their own server block).

        # omit server_name example.com block, same as above
        server {
                listen 80 default_server;
                listen [::]:80 default_server;
    
                location ~ ^/\.well-known/acme-challenge {
                    # LetsEncrypt
                    add_header Content-Type text/plain;
                    expires 0;
                    alias /var/www/html/acme/$host;
                    break;
                }
                location ~ ^/(?!\.well-known/acme-challenge) {
                    return 301 https://$host$request_uri;
                }
        }
        server {
                listen 443 ssl http2;
                listen [::]:443 ssl http2;
                server_name *.example.com;
                # omitting the rest for https://*.example.com
        }
    

    Setup certificates for the naked example.com, www.example.com and any others:

    sudo certbot certonly --manual -d example.com -d www.example.com -d abc.example.com

    0 讨论(0)
  • 2021-01-02 13:12

    If you don't have a certificate for domain.com redirecting from https://domain.com to https://www.domain.com will not work, because before the browser gets the redirect it has to successfully establish the SSL connection (https is http inside SSL) and this fails because the certificate does not match.

    0 讨论(0)
  • 2021-01-02 13:15

    I had similar kind of scenario and this is how I solved the redirection from

    https://domain.com -----> https://www.domain.com

       server {
          listen        443;
           server_name    domain.com;
             if ($host = domain.com) {
            rewrite ^(.*) https://www.domain.com:443$request_uri? permanent;
        }
    

    Hope this helps!

    Using if condition in nginx

    Directive if has problems when used in location context, in some cases it doesn't do what you expect but something completely different instead. In some cases it even segfaults. It's generally a good idea to avoid it if possible. The only 100% safe things which may be done inside if in location context are: return ...; rewrite ... last;

    0 讨论(0)
提交回复
热议问题