通过 www 访问。将显示 Nginx 欢迎页面 [+ Gunicorn + Django]

Accessing via www. will show Nginx welcome page [+ Gunicorn + Django]

Nginx + Ubuntu 18.04 + Django 2.2.10

直接通过 "www.examples.com" 访问将显示 nginx 欢迎页面,但访问其他任何内容 -- "examples.com"、"https://examples.com", "https://www.examples.com" -- 将按预期工作。

在 DigitalOcean 上,我有两个指向 IP 地址的 A 类记录 [www.examples.com、examples.com]——我相信它们设置正确。
在我的 Django 项目中,我设置了 ALLOWED_HOSTS = ['localhost', 'examples.com', '137.68.49.136', 'www.examples.com']

这是我的/etc/nginx/sites-available/project:

server {
    server_name examples.com www.examples.com;
    charset     UTF-8;

    error_log   /home/jay/eco/nginx-error.log;
    location = /favicon.ico { access_log off; log_not_found off; }
    location /static {
        alias /home/jay/eco/static;
    }

    location /media/ {
        alias /home/jay/eco/media/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/examples.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/examples.com/privkey.pem; # managed by Certb$
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = examples.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen      80;
    listen      [::]:80;
    server_name examples.com;
    return 404; # managed by Certbot


}

我相信这就是一切,但显然不是。我错过了什么?

您有两个 server 块,第一个使用 https 协议处理请求,第二个使用 http 协议处理请求。在其他一些文件中也有一个默认的 server 块,它响应 Nginx 欢迎页面。

您问题中的第二个 server 块仅处理 http://example.com 的请求。您需要在 server_name 指令中添加 www.example.com,并更新逻辑,以便将两个域名都重定向到 https 服务。

例如:

server {
    listen      80;
    listen      [::]:80;

    server_name example.com www.example.com;

    return 301 https://$host$request_uri;
}

详情见this document