2012-07-20 43 views
9

我试图用SSL在本地测试我的Django应用程序。我对@login_required装饰者有一个看法。所以当我点击/locker时,我被重定向到/locker/login?next=/locker。这与http正常工作。Django @login_required丢弃https

但是,每当我使用HTTPS,重定向莫名其妙地下降了安全连接,所以我得到的东西像https://cumulus.dev/locker -> http://cumulus.dev/locker/login?next=/locker

如果我直接去https://cumulus.dev/locker/login?next=locker页面打开罚款通过安全连接。但是一旦我输入用户名和密码,我就回到http://cumulus.dev/locker

我使用Nginx来处理SSL,然后与runserver交谈。我的nginx的配置是

upstream app_server_djangoapp { 
server localhost:8000 fail_timeout=0; 
} 

server { 
listen 80; 
server_name cumulus.dev; 

access_log /var/log/nginx/cumulus-dev-access.log; 
error_log /var/log/nginx/cumulus-dev-error.log info; 

keepalive_timeout 5; 

# path for static files 
root /home/gaurav/www/Cumulus/cumulus_lightbox/static; 

location/{ 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    if (!-f $request_filename) { 
     proxy_pass http://app_server_djangoapp; 
     break; 
    } 
} 
} 

server { 
listen 443; 
server_name cumulus.dev; 

ssl on; 
ssl_certificate /etc/ssl/cacert-cumulus.pem; 
ssl_certificate_key /etc/ssl/privkey.pem; 

access_log /var/log/nginx/cumulus-dev-access.log; 
error_log /var/log/nginx/cumulus-dev-error.log info; 

keepalive_timeout 5; 

# path for static files 
root /home/gaurav/www/Cumulus/cumulus_lightbox/static; 

location/{ 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Ssl on; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    if (!-f $request_filename) { 
     proxy_pass http://app_server_djangoapp; 
     break; 
    } 
} 
} 
+0

我要说,“哦,只是改变'settings.py'文件中的'LOGIN_URL'”...但我试过了,它不起作用。好问题。 – 2012-07-20 02:19:35

回答

4

Django是在普通HTTP运行仅次于代理,所以它总是用它来构建绝对URL(如重定向),除非你将其配置如何看到代理请求是最初是通过HTTPS制作的。

从Django 1.4开始,您可以使用SECURE_PROXY_SSL_HEADER设置来执行此操作。当Django看到配置的头文件时,它会将请求视为HTTPS而不是HTTP:request.is_secure()将返回true,https://将生成URL,依此类推。

但是,请注意文档中的安全警告:您必须必须确保代理从所有传入的客户端请求(HTTP和HTTPS)中替换或剥离受信头。上面的nginx配置与X-Forwarded-Ssl没有这样做,这使得它可以欺骗。

对此的常规解决方案是在每个代理配置中将X-Forwarded-Protocol设置为httphttps(适当时)。然后,你可以配置Django使用它来寻找它:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https') 
+0

谢谢! :)我使用Gunicorn的工作,但我记得设置标题,但不能使用标题设置,因为我仍然在1.3! – 2012-07-20 09:14:14

+0

@GauravDadhania你还记得你是怎么想出来的?我正在寻找回答http://stackoverflow.com/questions/29737089/how-do-i-use-a-login-redirect-with-https-in-django – YPCrumble 2015-04-21 21:25:09