Nginx 非 www 重定向到 www 且 SSL 不起作用

Nginx 非 www 重定向到 www 且 SSL 不起作用

我已经处理了好几个小时,但仍然看不出我的配置有什么问题。请参见下文。

/etc/nginx/sites-enabled/default

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


server {
    listen 443 ssl;
    server_name example.com www.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    ssl_ciphers 'ECDHE-RSA-AES128...;

    location / {
        include    uwsgi_params;
        uwsgi_pass    unix:/my_socket/site.sock;
    }    

    location /static/ {
        alias /my_static/location/;
    }

    location /media  {
        alias /my_media/location/;
    }



    location ~ /.well-known{
        allow all;
    }
    return 301 https://www.example.com$request_uri;
}

当我尝试访问示例.comwww.example.com它会重定向到https://www.example.com(这就是我想要的)但是除非我删除下面最后一行代码,否则页面将无法正常工作。

return 301 https://www.example.com$request_uri;

删除上面那行之后,所有链接都正常工作,但没有重定向到万维网


机器:

  • Ubuntu 14.04
  • nginx/1.4.6 (Ubuntu) 和 uWSGI
  • 在 Google Cloud Platform (Compute Engine) 中运行的 DJango 1.8.4

答案1

总结一下,配置这些重定向的正确方法是:

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

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    ssl_ciphers 'ECDHE-RSA-AES128...;

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

server {
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ... rules for the actual website ...
}

因此,我们有一个用于域名的 http 服务器块example.comwww.example.com执行重定向。

example.com然后我们有一个用于执行重定向的域的 https 服务器块。

然后我们有用于域的 https 的服务器块www.example.com,其中包含实际网站的设置。

答案2

正如评论中提到的,您应该在 443 块中添加内容。

例如,您应该添加上游并将所有请求转发到那里。

相关内容