我正在配置一个 Nginx 服务器,以便作为反向代理来为 Django 应用程序(在 Gunicorn 上运行)提供服务。
我的问题是我希望我的网站使用 HTTPS 进行保护,因此我希望我的 Django 应用能够确定连接是否安全。我使用的是 Django 1.4,因此我可以访问SECURE_PROXY_SSL_HEADER
,我将其配置为SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
。
现在,正如文档中提到的,我需要确保 Nginx 仅在需要时添加标头,并在不需要时删除它。因为我希望我的 Nginx 配置尽可能 DRY,所以我宁愿不要有两个配置文件(一个用于端口 80,一个用于端口 443)。
因此,我想知道 Nginx 中是否有一种方法可以确定连接是否是 https,并相应地添加(或删除)标头。
答案1
这个解决方案确实不是描述如何仅去除 HTTP 上的标头,如问题标题中所问。
解决您的问题的一个安全方法是添加
proxy_set_header X-Forwarded-Protocol $scheme;
它将设置X-Forwarded-Protocol
为http
HTTP 请求和https
HTTPS 请求。
这确保如果客户端设置了此标头,则会根据要求覆盖此标头https://docs.djangoproject.com/en/1.4/ref/settings/#secure-proxy-ssl-header。
笔记:如果您正在共享您的 Django 项目,请确保在包含时充分警告用户这一点SECURE_PROXY_SSL_HEADER
,settings.py
并且最好默认将其注释掉。