Nginx如何将https代理到非标准端口的http?

12
我已经配置了nginx将https流量代理到同一台机器上运行的http服务器。当我将nginx配置为在/代理https端口443时,一切都正常。但是我真的想侦听非标准端口。当我配置非标准端口时,nginx接收请求并将其发送到我的http服务器,但服务器响应浏览器的HTTP重定向,告诉它重定向到'https://server.com/someurl'。我的意思是重定向URL看起来很好,除了缺少正确的端口。我是否缺少需要在代理中设置的HTTP头?具体来说,我正在运行Tracks的http实例; http://getontracks.org。如果有影响,请参考我的(在标准端口上工作的)nginx服务器配置:
location /{
    proxy_pass http://localhost:50000;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_redirect off;
}
2个回答

29
问题出在这行代码 -
proxy_set_header Host $host;

当您的Web服务器(WEBrick)发出重定向响应时,它会包含此内容。

您可以更改它以包括非标准端口 -

proxy_set_header Host $host:$server_port;

这应该解决问题。


1
非常好。这解决了我的问题,我在nginx反向代理后运行flask应用程序时尝试生成包括非标准端口的正确URL,如flask片段35中所述,而无需触及该片段。 - Jan Vlcinsky
哇,这个小贴士真是救了我的命。我真的很惊讶这个答案竟然这么难找,感觉这应该是一个相当普遍的需求。不过算了,谢谢。 - undefined

1

这更多是上游主机(Tracks)上运行的应用程序问题,而不是Web服务器配置问题(当然,除非您的上游Web服务器配置包含重写规则)。不同的应用程序以不同的方式处理这些情况:有些需要显式配置参数告诉它们可以访问应用程序的实际URL,有些使用某些HTTP标头,有些使用其他HTTP标头。

由于Tracks是一个Rails应用程序,如果您在问题中添加相应的标签,您可能会得到更多专业的答案。


谢谢。我找到了一些论坛帖子,建议设置HTTP X-Forwarded-Port头,尽管这似乎更像是一个非标准的“非标准”头。我尝试在nginx配置中设置它,但没有成功。我想无论如何,正如你所说,运行在上游主机上的应用程序需要知道并采取类似的操作。 - kenen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接