Подтвердить что ты не робот

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.

4b9b3361

Ответ 1

if ( $scheme = "http" ) {
     rewrite ^/(.*)$   https://$host/ permanent;
}

Ответ 2

Мне нужно было немного больше, чтобы 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;
}

Ответ 3

server {
  listen  80;
  server_name  yourhttphost;
  rewrite ^ https://yourhttpshost$request_uri? permanent; #301 redirect
}
server {
  listen 443;
  server_name  yourhttpshost;
  ........
  the rest
  ........
}

Использование "if" в конфигурации nginx - очень плохая идея!