在 mod_proxy 重定向时保留原始请求 URL

在 mod_proxy 重定向时保留原始请求 URL

我在 Servlet 容器(端口 8080)上运行一个 Web 应用程序,该环境可以从互联网(外部)和公司内部(内部)访问,例如

http://external.foo.bar/MyApplication
http://internal.foo.bar/MyApplication

使用带有 mod_proxy 的 apache http 服务器将传入的(外部/内部)请求重定向到 servlet 容器。配置如下:

ProxyPass /MyApplication http://localhost:8080/MyApplication retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse /MyApplication http://localhost:8080/MyApplication

我现在面临的问题是,一些 MyApplication 响应依赖于原始请求 URL。具体来说:WSDL 文档将提供一个包含元素的元素schemaLocation="<RequestUrl>?xsd=MyApplication.xsd"

使用我当前的配置它总是看起来像

<xs:import namespace="..." schemaLocation="http://localhost:8080/MyApplication?xsd=MyApplication.xsd"/>

但它应该是

External Request: <xs:import namespace="..." schemaLocation="http://external.foo.bar/MyApplication?xsd=MyApplication.xsd"/>
Internal Request: <xs:import namespace="..." schemaLocation="http://internal.foo.bar/MyApplication?xsd=MyApplication.xsd"/>

我想这是一个常见的需求。但由于我不是 apache http 服务器及其模块配置方面的专家,如果有人能提供一些(详细的)帮助,我将非常高兴。

提前致谢!

PS: 我也发布了这篇文章堆栈溢出但我认为这可能是更好的地方。

答案1

ProxyPreserveHost如果你运行的是 Apache >= 2.0.31,那么你可以尝试按照描述设置指令这里

这应该将原始 Host 标头通过 mod_proxy 传递到您的应用程序中,并且通常使用 Host 标头在那里(在您的 Servlet 容器中)重建请求 URL,因此应该使用代理“之前”的主机和路径信息构建架构位置。

答案2

您应该能够在 apache 中执行 mod_rewrite,将完整 URL 编码为查询参数,或者可能是片段的一部分。这有多容易取决于您是否可能将其中一个用作传入查询的一部分。

例如,http://external.foo.bar/MyApplication可能会被重写,http://external.foo.bar/MyApplication#rewritemagic=http://external.foo.bar/MyApplication然后传递到 ProxyPass 然后被删除。

是的,有点像黑客行为,而且为了让重写和代理以正确的顺序工作并且不互相干扰,也许有点棘手,但它似乎应该可以工作。

相关内容