Джанго + 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.


person Rewolverine    schedule 21.07.2011    source источник
comment
попробуйте прочитать это - yuji.wordpress.com/2008/08/15/   -  person Vidyanand    schedule 22.07.2011


Ответы (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 — очень плохая идея!

person MechanisM    schedule 08.10.2011
comment
Это правильный ответ, как будто операторы обычно не являются хорошей идеей в конфигурациях nginx. - person eficker; 06.07.2014
comment
Да, я знаю о «если», хе-хе - person MechanisM; 10.07.2014

Мне нужно было немного больше, чтобы 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;
}
person sellonen    schedule 15.02.2013
comment
Ради потомства этот ответ работает, когда открыт только порт 443 (т.е. брандмауэр блокирует запрос на порт 80) - person fmorency; 21.12.2013
comment
uwsgi_pass_header позволяет передавать заголовок с сервера на клиент, так что это, вероятно, не то, что вам нужно. Что касается правильных перенаправлений, параметр UWSGI_SCHEME помог в моем случае без каких-либо пользовательских заголовков. Действительно ли необходима настройка SECURE_PROXY_SSL_HEADER? - person raacer; 26.10.2015

person    schedule
comment
Обработка if для каждого запроса очень неэффективна в Nginx. Лучше создать отдельный сервер :80 и перенаправлять каждый поступающий на него запрос. - person kravietz; 11.12.2015