从反向代理请求中保留协议和端口号
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
使用此配置,两个查询(来自lan
和wan
)都可以正常工作:
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 并将其隐藏到您在
如果它的 api.abc.com 它应该代理从 internal.abc.com:123 到 api.abc.com 的信息,而不是后面的端口号。 ProxyPassReverse 会为您完成这项工作。
【讨论】:
问题不在于如何代理。让我们假设代理工作(使用类似于您建议的解决方案)。问题是反向代理后面的机器(主机名'internal')如何知道原始用户请求使用的端口和协议。 所有数据通常都被转发过来,例如我将它用于 wordpress 管理项目。它将为我传递所有登录信息和 cookie 信息。我看到的大多数使用它的人似乎都将它用于不同端口上的 tomcat,但使用 proxypass 在内部隐藏它。 是的,login 和 cookie 确实是一起传递的。我的问题是我没有看到原始请求的协议(比如说 https)和端口也被传递。以上是关于从反向代理请求中保留协议和端口号的主要内容,如果未能解决你的问题,请参考以下文章