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

ric*_*ard 7 dns ssl https nginx dnsimple

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

  • 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
Run Code Online (Sandbox Code Playgroud)

我的服务器块如下(灵感来自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;
Run Code Online (Sandbox Code Playgroud)

什么有效:

  • 裸域被重定向到安全 https://www
  • http://www 域被重定向到安全 https://www
  • https:// www的作品

什么不:

  • Naked https://不起作用,浏览器抛出未找到的服务器

基本上我想将所有流量重定向到安全https://www.domain.com.我在这里错过了什么?

nsg*_*ver 6

我有类似的场景,这就是我解决重定向问题的方法

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;
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

在nginx中使用if条件

指令如果在位置上下文中使用时有问题,在某些情况下它不会按预期执行,而是完全不同.在某些情况下,甚至是段错误.如果可能的话,尽量避免使用它通常是个好主意.如果在位置上下文中,可以在内部完成的唯一100%安全的事情是:return ...; 重写...最后;


Ste*_*ich 5

如果您没有 domain.com 的证书,从https://domain.com重定向到https://www.domain.com将不起作用,因为在浏览器获得重定向之前,它必须成功建立 SSL 连接(https 是 SSL 内的 http)并且由于证书不匹配而失败。