簡體   English   中英

Nginx將http:// www和裸http / https重定向到https:// www

[英]Nginx redirect http://www and naked http/https to https://www

我想重定向以下域中的所有流量:

  • http://domain.com
  • http://www.domain.com
  • https://domain.com

  • https://www.domain.com

我有上述域名的SSL證書。 它托管了一個由Passenger提供服務的Rails應用程序。

要完成裸域重定向,我在DNSimple帳戶中設置了URL重定向:

URL domain.com  3600  https://www.domain.com

我的服務器塊如下(靈感來自Nginx no-www to www和www to no-www等):

server {
    listen          80;
    listen          443;
    server_name     domain.com;

    ssl                             on;
    ssl_certificate                 /etc/ssl/domain-ssl.crt;
    ssl_certificate_key             /etc/ssl/domain.key;
    ssl_session_timeout             5m;
    ssl_protocols                   SSLv2 SSLv3 TLSv1;
    ssl_ciphers                     HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers       on;

    server_tokens   off;
    access_log      /dev/null;
    error_log       /dev/null;

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

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

    root                            /home/deploy/app/current/public;
    passenger_enabled               on;
    passenger_app_env               production;
    passenger_set_cgi_param         HTTP_X_FORWARDED_PROTO https;

    ssl                             on;
    ssl_certificate                 /etc/ssl/domain-ssl.crt;
    ssl_certificate_key             /etc/ssl/domain.key;
    ssl_session_timeout             5m;
    ssl_protocols                   SSLv2 SSLv3 TLSv1;
    ssl_ciphers                     HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers       on;
}

passenger_pre_start https://www.domain.com;

什么有效:

  • 裸域被重定向到安全https://www
  • http://www域被重定向到安全https://www
  • https:// www有效

什么不:

  • Naked https://不起作用,瀏覽器拋出未找到的服務器

基本上我想將所有流量重定向到安全的https://www.domain.com 我在這里錯過了什么?

我有類似的場景,這就是我解決重定向問題的方法

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;
    }

希望這可以幫助!

在nginx中使用if條件

指令如果在位置上下文中使用時有問題,在某些情況下它不會按預期執行,而是完全不同。 在某些情況下,甚至是段錯誤。 如果可能的話,盡量避免使用它通常是個好主意。 如果在位置上下文中,可以在內部完成的唯一100%安全的事情是:return ...; 重寫...最后;

如果您沒有domain.com的證書,從https://domain.com重定向到https://www.domain.com將無法正常工作,因為在瀏覽器獲得重定向之前,它必須成功建立SSL連接(https是SSL中的http)並且由於證書不匹配而失敗。

為裸域提供特定的服務器塊以及一般默認值。 將首先使用更具體的。

    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
    }

我使用Let's Encrypt作為我的證書,因此類似於default_server的以下內容可防止重定向ACME挑戰(請注意第二個通配符server_name用於處理所有沒有自己的服務器塊的https://*.example.com )。

    # 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
    }

為example.com,www.example.com和其他任何人設置證書:

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

以下將有所幫助。

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 <<======
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM