首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django @login_required删除https

Django @login_required删除https
EN

Stack Overflow用户
提问于 2012-07-20 09:23:56
回答 1查看 1.7K关注 0票数 9

我正在尝试使用SSL在本地测试我的Django应用程序。我可以看到@login_required装饰器的视图。因此,当我点击/locker时,我会被重定向到/locker/login?next=/locker。这在http上运行得很好。

然而,每当我使用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配置是

代码语言:javascript
复制
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;
    }
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-20 10:29:11

Django只在代理后面的纯HTTP上运行,所以它总是使用它来构造绝对URL(例如重定向),除非您配置它来查看代理请求最初是通过HTTPS发出的。

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

但是,请注意文档中的安全警告:您必须确保代理替换或剥离所有传入客户端请求中的trusted标头。上面的nginx配置不能用X-Forwarded-Ssl做到这一点,这使得它是可欺骗的。

解决此问题的常规解决方案是在每个代理配置中根据需要将X-Forwarded-Protocol设置为httphttps。然后,您可以使用以下命令配置Django以查找它:

代码语言:javascript
复制
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11571616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档