Apache 在mod_代理重定向上保留原始请求URL

Apache 在mod_代理重定向上保留原始请求URL,apache,web-applications,mod-rewrite,redirect,mod-proxy,Apache,Web Applications,Mod Rewrite,Redirect,Mod Proxy,我正在一个Servlet容器(端口8080)上运行一个WebApplication,这个环境可以从internet(外部)和公司内部(内部)访问,例如 使用带有mod_代理的apachehttp服务器将输入(外部/内部)请求重定向到servlet容器。配置如下所示: ProxyPass /MyApplication http://localhost:8080/MyApplication retry=1 acquire=3000 timeout=600 Keepalive=On ProxyPass

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

使用带有mod_代理的apachehttp服务器将输入(外部/内部)请求重定向到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=“?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"/>
外部请求:
内部请求:
我想这是一个共同的要求。但由于我不是ApacheHTTP服务器及其模块配置方面的专家,如果有人能提供一些(详细的)帮助,我将非常高兴


提前谢谢

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

例如,
http://external.foo.bar/MyApplication
可能会被重写为
http://external.foo.bar/MyApplication#rewritemagic=http://external.foo.bar/MyApplication
然后将其传递到ProxyPass,然后剥离


是的,这是一个小技巧,也许需要让重写和代理以正确的顺序工作,并且不相互干扰,但它似乎应该可以工作。

如果您运行的是Apache>=2.0.31,那么您可以尝试设置所述的
ProxyPreserveHost
指令

这应该通过mod_代理将原始主机头传递到应用程序中,通常会使用主机头在那里(在Servlet容器中)重新生成请求URL,因此应该使用代理“之前”的主机和路径信息构建模式位置


(为了完整起见也在此处发布)

如果您希望保留原始主机名和代理主机名,这里是另一种选择


如果您在Apache配置中使用mod_proxy disable
ProxyPreserveHost
。对于大多数代理服务器,包括mod_proxy,请阅读应用程序中的
X-Forwarded-Host
标题。这标识HTTP请求提供的原始主机头

您可以阅读此处设置的头mod_proxy(以及可能的其他标准代理服务器):


感谢您解决我的问题,并感谢+1提供可能的解决方法。但是我的应用程序是建立在这个框架之上的,我怀疑查询参数是否有帮助。我想我必须使用原始请求访问它,我想知道在我的场景中这是否/如何可能。@K.Claszen:我建议您转储apache提供给您的所有环境、变量、头和其他信息,以查看是否有东西可能被注入。另外,考虑一下你是否可以使用PROXYRESWORKOST或PROXIVIVE(VAS是一个可能被设置和对你有用的头的例子)。如果这能解决我的问题,那就很简单了。。。不过,谢谢你的支持
ProxyPreserveHost
非常适合我,无需更改我的应用程序(请阅读X-Forwarded-Host)。不过,还是要感谢你提供了另一种可能的解决方案。这对我也很管用。但是,我遇到了一个需要原始主机名和代理传递的主机名的情况。因此,只需在此处添加此项,以供将来参考。
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"/>