我们为基于 Django 的应用程序使用 Ngnix + uWSGI 设置。
我们的问题是,即使我们在 https 上提供内容,它也request.is_secure()
总是返回false 。
uWSGI文档中提到过,我uwsgi_param UWSGI_SCHEME $scheme
在nginx配置或者uwsgi_params中设置了,但是没有用。
我们还为同一应用程序提供了基于 Nginx + apache 的设置,它工作得很好。
任何帮助将不胜感激。
提前致谢。
问题解决了 !!
我们尝试了几件事来修复它,但无法让它工作。关于我们稍后分析的问题,我将在这里提供更多信息。我们当前在 webfaction 上的设置如下所示:
WebFaction Nginx -> 我们的 nginix -> uwsgi 服务器
我们发现 webfaction nginx 的配置存在一些问题,它正在通过 http 协议本身将(https 和 http)的所有流量传递给我们的 nginx。因此,首先我们更改了此设置以将正确的流量传递给正确的服务器。
还是我们发现两个 nginx 服务器设置的 $scheme 都不正确,所以我们最后做的是在我们的 nginx 中设置以下内容进行 https 配置:
uwsgi_param UWSGI_SCHEME https;
这解决了现在的问题。
对于gunicorn
服务器固定:
将此行添加到nginx.conf
文件中:
proxy_set_header X-Forwarded-Proto $scheme;
并将这一行添加到settings.py
文件中:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
我花了半天的时间来解决这个问题,所以让每个人都头疼
首先,
放
uwsgi_param HTTP_X_FORWARDED_PROTO $scheme;
在 nginx.conf
然后将此行放入 settings.py
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
如果您使用的是 Django<1.4,您还需要启用django-secure
中间件
我建议使用request.scheme
而不是request.is_secure()
检查我们当前是否使用https
协议。
is nginx the https terminator or you have some other server before it ?
In such a case the $scheme variable in nginx will always map to 'http'. You have to manually set it to 'https'
uwsgi_param UWSGI_SCHEME https;