Django + uwsgi + nginx + SSL

Rew*_*ine 12 django uwsgi dotcloud

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

if ($http_x_forwarded_port != 443) { rewrite ^ https://$http_host/; }
Run Code Online (Sandbox Code Playgroud)

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

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

小智 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;
}
Run Code Online (Sandbox Code Playgroud)


Mec*_*isM 7

server {
  listen  80;
  server_name  yourhttphost;
  rewrite ^ https://yourhttpshost$request_uri? permanent; #301 redirect
}
server {
  listen 443;
  server_name  yourhttpshost;
  ........
  the rest
  ........
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是正确答案,因为"if"语句在nginx配置中通常不是一个好主意. (2认同)