Django + uwsgi + nginx + SSL

12

我在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
请阅读这篇文章 - http://yuji.wordpress.com/2008/08/15/django-nginx-making-ssl-work-on-django-behind-a-reverse-proxy/,该文章讲述了如何在反向代理后的Django上使用SSL。 - Vidyanand
3个回答

14

我需要做一些调整,让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;
}

为了后人的纪念,这个答案仅在只开放端口443时有效(即防火墙阻止端口80上的请求)。 - fmorency
uwsgi_pass_header 允许从服务器传递头到客户端,所以这可能不是您在此处需要的。正确的重定向怎么样?在我的情况下,UWSGI_SCHEME 参数解决了问题,而无需任何自定义标头。SECURE_PROXY_SSL_HEADER 设置真的有必要吗? - raacer

7
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
这是正确的答案,因为在nginx配置中,“if”语句通常不是一个好主意。 - eficker
1
是的,我知道关于“if”的呵呵。 - MechanisM

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

2
在Nginx中,为每个请求处理一个“if”非常低效。最好创建一个单独的:80服务器并重定向每个请求。 - kravietz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接