我们正在为基于Django的应用程序使用Nginx + uWSGI设置。
我们的问题是,即使我们在https上提供内容,request.is_secure()
也总是返回false。
正如uWSGI文档中所提到的,我在nginx配置或uwsgi_params中设置了uwsgi_param UWSGI_SCHEME $scheme
,但没有用。
我们也为同一个应用程序设置了基于Nginx + apache的设置,它运行得很好。
任何帮助将不胜感激。
提前致谢。
问题解决了 !!
我们尝试了几件事来解决它,但无法使其正常工作。我将在此处提供有关我们稍后分析的问题的更多信息。我们目前在webfaction上的设置如下所示:
WebFaction Nginx - >我们的nginix - > uwsgi服务器
我们发现webfaction nginx的配置存在一些问题,它将(https和http)的所有流量传递给http协议本身的nginx。首先,我们更改了此设置,以将正确的流量传递给正确的服务器。
我们仍然发现两个nginx服务器设置的$ scheme都不正确,所以我们最终做的是在我们的nginx中为https配置设置以下内容:
uwsgi_param UWSGI_SCHEME 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
中间件
是nginx的https终结者还是你之前有其他服务器?
在这种情况下,nginx中的$ scheme变量将始终映射到'http'。您必须手动将其设置为“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')
我建议使用request.scheme
而不是request.is_secure()
来检查我们目前是否使用https
协议。