request.is_secure() 对于 uwsgi 服务器总是返回 false
Posted
技术标签:
【中文标题】request.is_secure() 对于 uwsgi 服务器总是返回 false【英文标题】:request.is_secure() always returns false with uwsgi server 【发布时间】:2012-07-11 14:42:31 【问题描述】:我们正在为基于 Django 的应用程序使用 Ngnix + uWSGI 设置。
我们的问题是 request.is_secure()
总是返回 false,即使我们在 https 上提供内容。
正如uWSGI文档中提到的,我在nginx配置或者uwsgi_params中设置了uwsgi_param UWSGI_SCHEME $scheme
,但是没有用。
我们还为同一个应用程序提供了基于 Nginx + apache 的设置,它工作得很好。
任何帮助将不胜感激。
提前致谢。
【问题讨论】:
你在哪里设置uwsgi_param UWSGI_SCHEME $scheme;
?
远射:您在 AWS 上吗?具体来说,在 AWS 上的 ELB 背后?
【参考方案1】:
问题解决了!!
我们尝试了一些方法来修复它,但无法使其正常工作。 关于我们稍后分析的问题,我将在这里提供更多信息。 我们当前在 webfaction 上的设置如下所示:
WebFaction Nginx -> 我们的 nginix -> uwsgi 服务器
我们发现webfaction nginx的配置存在一些问题,它正在将(https和http)的所有流量传递给我们的nginx on http协议本身。因此,首先我们更改了此设置以将正确的流量传递到正确的服务器。
我们还是发现两个nginx服务器设置的$scheme都不正确,所以我们最后做的是在我们的nginx中为https配置设置如下:
uwsgi_param UWSGI_SCHEME https;
这解决了现在的问题。
【讨论】:
【参考方案2】:对于gunicorn
服务器固定为:
将此行添加到nginx.conf
文件中:
proxy_set_header X-Forwarded-Proto $scheme;
并将这一行添加到settings.py
文件中:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
【讨论】:
【参考方案3】:我花了半天的时间来解决这个问题,所以让大家头疼
首先,
设置
uwsgi_param HTTP_X_FORWARDED_PROTO $scheme;
在 nginx.conf 中
然后将这一行放到settings.py中
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
如果您使用的是 Djangodjango-secure 中间件
【讨论】:
【参考方案4】:我建议使用request.scheme
而不是request.is_secure()
来检查我们当前是否使用https
协议。
【讨论】:
在使用 request.scheme 时需要小心谨慎,在许多情况下,https 连接会在负载均衡器级别终止。在负载均衡器之后,可能在内部它可能只使用 http 来传输数据。 查看主存储库 link 中的 Django 代码,它表明code
is_secure()code
使用方案来检测它是否安全。【参考方案5】:
是 nginx 是 https 终结者,还是在它之前有其他服务器?
在这种情况下,nginx 中的 $scheme 变量将始终映射到“http”。您必须手动将其设置为“https”
uwsgi_param UWSGI_SCHEME https;
【讨论】:
我们正在使用 webfaction,在我们的 nginx 之前有一个 webfaction nginx,它必须是 https 终止符。但是我们还有一个类似的设置,我们使用的是 nginx + apache。不存在这样的问题以上是关于request.is_secure() 对于 uwsgi 服务器总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章