Django + uwsgi + nginx + SSL
Я использую Django на DotCloud, который использует Django поверх uwsgi + nginx. Я пытаюсь перенаправить весь трафик http на https, что приводит к петле перенаправления. Я использую следующую конфигурацию http
if ($http_x_forwarded_port != 443) { rewrite ^ https://$http_host/; }
Кажется, что Django не понимает, что работает по протоколу https, а заголовок не сохраняется. Он перенаправляет https://url.com/ на http://url.com/accounts/login/ который перенаправляет снова и снова, что приводит к циклу перенаправления. Я не очень разбираюсь в nginx и не очень хорошо это понимаю. Что я могу делать не так?
Вкратце, как мне запустить перенаправление http на https в django, работающем поверх uswsgi и nginx.
3 ответа
if ( $scheme = "http" ) {
rewrite ^/(.*)$ https://$host/ permanent;
}
Мне нужно было немного больше, чтобы Django знал, что он должен использовать https.
В settings.py я добавил SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
И в конфигурации nginx
location / {
proxy_set_header X-Forwarded-Proto https;
include uwsgi_params;
uwsgi_param UWSGI_SCHEME https;
uwsgi_pass_header X_FORWARDED_PROTO;
uwsgi_pass unix:///path/to/socket;
}
server {
listen 80;
server_name yourhttphost;
rewrite ^ https://yourhttpshost$request_uri? permanent; #301 redirect
}
server {
listen 443;
server_name yourhttpshost;
........
the rest
........
}
Использование "if" в конфигурации nginx - очень плохая идея!