Django Возвращает http вместо HTTPS в Prod
Я развернул приложение Django в Ec2 с помощью gunicorn и nginx, но ссылки, генерируемые django, являются http, а не HTTPS. Я включил необходимые настройки. Например, когда у меня есть разбивка на страницы, я получаю
count": 12,
"next": "http://my.example.com/article/?page=2",
"previous": null,
Вместо
count": 12,
"next": "https://example.com/journal/?page=2",
"previous": null,
Все ссылки такие, хотя они перенаправляются, когда вы нажимаете на них или копируете в браузере, но это вызывает забавную реакцию во внешнем интерфейсе
Моим DNS управляет cloudflare, и, похоже, там все в порядке.
#In settings
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
USE_X_FORWARDED_HOST = True
#My nginx file
server {
listen 80;
server_name fronend.example.com;
location / {
autoindex on;
root /home/ubuntu/frontend/dist/frontend;
try_files $uri $uri/ /index.html;
}
}
# Backend Nginx Config
server {
listen 80;
server_name backend.example.com;
location = /favicon.ico {
access_log off;
log_not_found off;
}
location /staticfiles/ {
alias /home/ubuntu/backend/static;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
# proxy_set_header Host $host; #I commented these out when I was troubleshootng
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/backend.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/backend.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
}
server {
if ($host = backend.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name backend.example.com;
return 404; # managed by Certbot
}
Некоторые инструкции были добавлены Certbot, когда я регистрировался для получения SSL-сертификата. Хотя до и после ssl-сертификации ничего не изменилось.
Следует отметить, что это приводит к различным реакциям при развертывании на рендере (работает нормально и показывает HTTPS) даже без настроек USE_X_FORWARDED_HOST и SECURE_PROXY_SSL_HEADER в настройках django
Я нашел ответ благодаря вопросу Ссылки на страницы фреймворка Django REST не используют HTTPS
установка proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
в nginx решает проблему.