通过 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。
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。