我正在链接我的设置
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 直通?