从反向代理请求中保留协议和端口号

Posted

技术标签:

【中文标题】从反向代理请求中保留协议和端口号【英文标题】:Retaining protocol and port number from reverse proxy request 【发布时间】:2014-03-03 03:43:42 【问题描述】:

案例:

用户请求https://api.abc.com

这是反向代理 (Apache 2.2) 到 http://internal.abc.com:123 的内部服务器服务器

根据Retain original request URL on mod_proxy redirect,添加:

ProxyPreserveHost On

到httpd.conf,internal.abc.com当前将原始请求url识别为:

http://api.abc.com:123

我有什么办法可以恢复 https://api.abc.com 的原始 URL 吗?也就是要同时保留原来的协议(http)和端口(80,或者空也可以)

【问题讨论】:

嗨 ChaimKut,你找到解决方案了吗?如果是的话,你能分享一下吗?谢谢 【参考方案1】:

你需要这个参数RequestHeader set X-Forwarded-Proto "https",没有这个,返回的位置就是http://api.abc.com

ProxyRequests Off
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"

ProxyPass / http://internal.abc.com:123
ProxyPassReverse / http://internal.abc.com:123

使用此配置,两个查询(来自lanwan)都可以正常工作:

https://api.abc.com
http://internal.abc.com:123

【讨论】:

【参考方案2】:

我解决这个问题的方法是在我的虚拟主机文件中添加一个标题。 RequestHeader 设置 original-protocol-ssl 为真

然后,您需要在代码中检查此标头以确定它的来源。

【讨论】:

【参考方案3】:
ProxyRequests Off
ProxyPreserveHost On

ProxyPass / http://internal.abc.com:123
ProxyPassReverse / http://internal.abc.com:123

我在自己的环境中测试的这段代码应该采用 internal.abc.com:123 并将其隐藏到您在 括号中添加代码的任何 url。

如果它的 api.abc.com 它应该代理从 internal.abc.com:123 到 api.abc.com 的信息,而不是后面的端口号。 ProxyPassReverse 会为您完成这项工作。

【讨论】:

问题不在于如何代理。让我们假设代理工作(使用类似于您建议的解决方案)。问题是反向代理后面的机器(主机名'internal')如何知道原始用户请求使用的端口和协议。 所有数据通常都被转发过来,例如我将它用于 wordpress 管理项目。它将为我传递所有登录信息和 cookie 信息。我看到的大多数使用它的人似乎都将它用于不同端口上的 tomcat,但使用 proxypass 在内部隐藏它。 是的,login 和 cookie 确实是一起传递的。我的问题是我没有看到原始请求的协议(比如说 https)和端口也被传递。

以上是关于从反向代理请求中保留协议和端口号的主要内容,如果未能解决你的问题,请参考以下文章

NGINX 反向代理响应

WEB服务-Nginx之7-反向代理

mac nginx 反向代理解决微信小程序端口问题

nginx做反向代理时出现302错误

nginx串联(一台反向代理,一台分发)引起问题

nginx实现反向代理 配置多域名以及多端口号