Nginx www перенаправляет на не-www, браузер говорит, что ваше соединение с этим сайтом небезопасно, Django
Я не могу подключиться к своему сайту с помощью www.example.com, он говорит "не безопасно" только https://example.com работает.
Сначала я не установил DNS A запись для www для перенаправления на ip моего сервера, поэтому www.example.com не работал, но как только я добавил www A запись, теперь он показывает Not Secure с красной линией https через него, когда я перехожу на www.example.com.
Вот мой myapp.conf из nginx sites-available:
upstream myapp_app_server {
server unix:/apps/myapp/myapp_env/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com-0001/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com-0001/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
client_max_body_size 4G;
access_log /etc/nginx/logs/nginx-access-prod.log;
error_log /etc/nginx/logs/nginx-error-prod.log;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
alias /var/www/html/myapp/static/;
}
location /media/ {
alias /var/www/html/myapp/media/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://myapp_app_server;
break;
}
if ( $host !~* ^(example.com|www.example.com)$ ) {
return 444;
}
}
}
Вот мой nginx.conf из etc/nginx:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Когда я ввожу команду:
curl -I http://example.com/
Я получаю вывод:
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0
Date: Fri, 18 Mar 2022 03:43:51 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/
Я также использую django и вот мои настройки безопасности в settings.py:
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True
CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = "DENY"
SECURE_HSTS_SECONDS = 3600
SECURE_HSTS_PRELOAD = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
Я прослушал несколько уроков на youtube и в блоге, а также другие сообщения на stackoverflow, я пробовал и return 301 https://$server_name$request_uri;, и return 301 https://example.com$request_uri; вместе с sudo systemctl start nginx Я просто не могу заставить www.example.com перенаправить на https://example.com.
Также я продолжал получать письма о недопустимом заголовке HTTP_HOST от ботов с GET-запросами. Это было исправлено, когда я добавил:
if ( $host !~* ^(example.com|www.example.com)$ ) {
return 444;
}
Однако я переустановил Certbot и получил новый сертификат, чтобы начать все сначала, но после этого я стал получать письма с недопустимым заголовком HTTP_HOST от django из-за сканирующих ботов. Certbot внес автоматические изменения в мои файлы nginx .conf, однако я думал, что получил блок возврата 444 таким, каким он был. Я использовал sudo certbot --nginx для установки сертификатов. Https всегда подключался нормально и сейчас подключается нормально.