在mod_proxyredirect上保留原始的请求URL

我正在一个可以从互联网(外部)和公司内部(内部)访问的环境中运行Servlet容器(端口8080)上的WebApplication,例如

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

使用带有mod_proxy的apache http服务器将包含(外部/内部)请求redirect到servlet容器。 configuration如下所示:

 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"元素。

用我目前的configuration,它总是看起来像

 <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服务器及其模块的configuration,如果有人可以提供一些(详细的)帮助,我会很高兴。

提前致谢!

PS:我也发布了这个在stackoverflow,但认为这可能是更好的地方。

如果您正在运行Apache> = 2.0.31,那么您可以尝试按照此处所述设置ProxyPreserveHost指令。

这应该通过原来的主机头通过mod_proxy到你的应用程序,通常请求URL将在那里(在你的Servlet容器中)使用主机头来重build,所以架构位置应该使用主机和path信息从“之前”代理。

你应该可以在apache中做一个mod_rewrite,将完整的URL作为查询参数进行编码,也可以作为片段的一部分。 这可能是多么容易取决于你是否可以使用一个或另一个作为您的传入查询的一部分。

例如, http://external.foo.bar/MyApplication可能会被重写为http://external.foo.bar/MyApplication#rewritemagic=http://external.foo.bar/MyApplication然后传入ProxyPass然后剥离出来。

有点破解,是的,也许有点棘手,重写和代理工作在正确的顺序,而不是互相干扰,但它似乎应该工作。