如何让Nginx转发HTTP_X_FORWARDED_PROTO标头?


18

我正在链接我的设置

nginx > apache/php

haproxy > nginx > apache/php

(使用带有ssl支持的haproxy 1.5-dev18进行编译)

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

如何设置nginx以转发HTTP_X_FORWARDED_PROTO标头(如果存在),否则如何继续基于连接进行设置?

Answers:


36

我想出了解决方法。问题是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;

除非我缺少任何内容,否则您的前后proxy_set_header行是相同的。
Wilfred Hughes

1
$schemeVS $thescheme
Arlen Beiler

在少数情况下这不是不安全的吗?如果Web浏览器向haproxy发送HTTP请求,然后haproxy然后向Nginx发送HTTPS请求- default $scheme则将发生这种情况,将其设置$thescheme为HTTPS,尽管实际上(向haproxy的)请求是不安全的HTTP。—为避免这种情况,该怎么办:default $http_x_forwarded_proto; '' $scheme;,因此,如果haproxy表示HTTP,它将受到尊重。
KajMagnus '18年

在这里建议:stackoverflow.com/a/21911864/694469(即default $http_x_forwarded_proto;)。
KajMagnus '18年

2

我对AWS ELB也有同样的需求

这是我的解决方法:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;

我应该在$http_x_forwarded_proto某个地方下注吗?那是什么?
乔纳森

developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…$ http_x_forwarded_proto是NGINX的实现
jobwat

2
您的回答刚刚解决了我三天来一直提出的问题!所有其他职位上的AWS负载均衡以https倡导的主题proxy_set_header X-Forwarded-Proto $scheme;,这是不行的
MikeMarsian

1

我不能只是发表评论,所以我将其发布为答案:您能否将部分或全部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直通吗?


您解决问题了吗?
Yannovitch 2013年

1
我想到了。您的回答并没有直接帮助,但是第二个链接帮助我找到了解决问题的方法。谢谢。
Echo说恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.