Nginx:在 HTTP 上删除标头,在 HTTPS 上添加标头

Nginx:在 HTTP 上删除标头,在 HTTPS 上添加标头

我正在配置一个 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-ProtocolhttpHTTP 请求和httpsHTTPS 请求。

这确保如果客户端设置了此标头,则会根据要求覆盖此标头https://docs.djangoproject.com/en/1.4/ref/settings/#secure-proxy-ssl-header


笔记:如果您正在共享您的 Django 项目,请确保在包含时充分警告用户这一点SECURE_PROXY_SSL_HEADERsettings.py并且最好默认将其注释掉。

相关内容