我在Servlet容器(端口8080)上运行WebApplication,该环境可以从Internet(外部)和内部公司(内部)访问,例如。
http://external.foo.bar/MyApplication
http://internal.foo.bar/MyApplication
使用带有mod_proxy的apache http服务器将incomming(外部/内部)请求重定向到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服务器及其模块的配置,如果有人能提供一些(详细的)帮助,我会很高兴。
提前致谢!
答案 0 :(得分:25)
如果您正在运行Apache&gt; = 2.0.31,那么您可能会尝试按照here所述设置ProxyPreserveHost
指令。
这应该将原始主机头通过mod_proxy传递到您的应用程序中,并且通常使用Host头在那里(在您的Servlet容器中)重建请求URL,因此应使用主机和路径信息来构建架构位置。 “之前”代理。
(为了完整起见,也在这里发布)
答案 1 :(得分:6)
如果您希望同时保留原始主机名和代理主机名,则可以使用另一种方法。
如果您在Apache配置中使用mod_proxy disable ProxyPreserveHost
。对于大多数代理服务器(包括mod_proxy),请阅读应用程序中的X-Forwarded-Host
标头。这标识了HTTP请求提供的原始主机头。
您可以阅读此处设置的标题mod_proxy(以及可能的其他标准代理服务器):
答案 2 :(得分:1)
您应该能够在apache中执行mod_rewrite,将完整的URL编码为查询参数,或者可能是片段的一部分。这可能有多容易取决于您是否可以使用其中一个作为传入查询的一部分。
例如,http://external.foo.bar/MyApplication
可能会被重写为http://external.foo.bar/MyApplication#rewritemagic=http://external.foo.bar/MyApplication
,然后传递到ProxyPass然后被剥离。
有点黑客,是的,也许有点难以让重写和代理以正确的顺序工作而不会相互干扰,但它似乎应该有效。