Django + uwsgi + nginx + SSL

时间:2011-07-21 21:50:53

标签: django uwsgi dotcloud

我在DotCloud上使用Django,它在uwsgi + nginx之上使用Django。我试图将所有http流量重定向到https,这导致重定向循环。我使用以下http配置

if ($http_x_forwarded_port != 443) { rewrite ^ https://$http_host/; }

Django似乎不明白它是在https上运行而且标头没有保留。它会将https://url.com/重定向到http://url.com/accounts/login/,它会再次重定向并再次导致重定向循环。我不是nginx的专家,也不太了解它。我能做错什么?

简而言之,如何在运行在uswsgi和nginx之上的django中将http重定向到https。

3 个答案:

答案 0 :(得分:12)

我需要更多一点让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;
}

答案 1 :(得分:6)

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

在nginx配置中使用“if”是一个非常糟糕的主意!

答案 2 :(得分:3)

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