首页 > 解决方案 > Nginx 重定向(非 www 到 www)不适用于 Certbot

问题描述

我有一个运行 Python/Django/uWSGI/Nginx 设置的网站。我还使用 Certbot 在我的网站上启用 https。我从非 www 到 www 的重定向(例如“example.com”到“www.example.com”)会导致“错误请求(400)”消息,即使我无法发现与 Nginx/Certbot 文档的任何偏差. 这是我的sites-availableNginx 代码的相关部分:

server {
    listen 80;
    server_name example.com www.example.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/myname/example;
    }

    location / {
        include        uwsgi_params;
        uwsgi_pass     unix:/run/uwsgi/activities.sock;
    }

    listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; #managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; #managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot

}

我找到了一个类似的 StackOverflow 答案(Nginx: redirect non-www to www on https),但没有一个解决方案对我有用。我有 example.com 和 www.example.com 的 SSL 证书。我还尝试根据该答案中的评论为 example.com 创建一个单独的 443 ssl 服务器块,但它也不起作用。我的sites-availablesites-enabled代码是一样的。

我究竟做错了什么?

标签: djangosslnginxhttpsurl-redirection

解决方案


似乎 server_name 在转换为 $host 变量时选择了 server_name 列表中的第一个。让我知道这是否有效。我目前无法对此进行完全测试。

尝试将 server_name 交换server_name www.example.com example.com;为以及更改return 301 https://$host$request_uri;return 301 https://$server_name$request_uri;

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

server {
    listen 443 ssl;
    # SSL CERT STUFF.
    server_name example.com;
    return 301 https://www.$server_name$request_uri;
}

server {
    listen 443 ssl;
    # SSL CERT STUFF.
    server_name www.example.com;

    # LOCATION STUFF
}

推荐阅读