如何让 nginx 转发 HTTP_X_FORWARDED_PROTO 标头?

如何让 nginx 转发 HTTP_X_FORWARDED_PROTO 标头?

我正在链接我的设置

nginx > apache/php

haproxy > nginx > apache/php

(使用已编译 ssl 支持的 haproxy 1.5-dev18)

nginx 和 haproxy 都已正确设置以设置 HTTP_X_FORWARDED_PROTO 标头。但是,当 nginx 从 haproxy 获取 ssl 流量时,它会将连接视为 http 并将标头设置为 http。

如果存在 HTTP_X_FORWARDED_PROTO 标头,我该如何设置 nginx 来转发该标头,否则继续根据连接进行设置?

答案1

我找到了解决方法。问题是 nginx 覆盖了 haproxy 在我的配置中设置的标头:

proxy_set_header X-Forwarded-Proto $scheme;

我通过添加以下内容修复了它:

map $http_x_forwarded_proto $thescheme {
     default $scheme;
     https https;
 }   

并更改 proxy_set_header 行以使用新方案:

proxy_set_header X-Forwarded-Proto $thescheme;

答案2

我对 AWS ELB 也有同样的需求

这是我的解决方法:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;

答案3

我无法发表评论,因此我将其作为答案发布:您能否向我们提供部分或全部 nginx 配置,以便我们了解其中存在哪些问题?可能还有您的 HAProxy 配置?

我能想到的第一个问题是您的 HAProxy 正在执行 SSL 终止。总而言之,为了减轻后端服务器的负担,可以配置负载均衡器来执行所有 SSL 操作,然后通过 HTTP 与后端服务器通信。就像这里的方案一样:http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

为了给您的问题提供一个很好的答案,您可以检查一下 http<>https 配置中是否存在任何环回问题吗?也许您可以将 http 重定向到 http,将 https 重定向到 https,然后强制将 http 重定向到 https。

您也可以检查一下您的 HAProxy 配置中是否启用了 SSL 直通?

相关内容