保留mod_proxy重定向上的原始请求URL

FrV*_*aBe 22 apache mod-rewrite redirect web-applications mod-proxy

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

http://external.foo.bar/MyApplication
http://internal.foo.bar/MyApplication
Run Code Online (Sandbox Code Playgroud)

使用带有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
Run Code Online (Sandbox Code Playgroud)

我现在面临的问题是某些MyApplication响应依赖于原始请求URL.具体:将为WSDL文档提供具有元素的schemaLocation="<RequestUrl>?xsd=MyApplication.xsd"元素.

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

<xs:import namespace="..." schemaLocation="http://localhost:8080/MyApplication?xsd=MyApplication.xsd"/>
Run Code Online (Sandbox Code Playgroud)

但它应该是

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"/>
Run Code Online (Sandbox Code Playgroud)

我想这是一个常见的要求.但由于我不是apache http服务器及其模块配置的专家,如果有人可以提供一些(详细的)帮助,我会很高兴.

提前致谢!

小智 27

如果您正在运行Apache> = 2.0.31,那么您可能会尝试ProxyPreserveHost此处所述设置指令.

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

(为了完整起见,也在这里发布)


ric*_*alm 6

如果要保留原始主机名和代理主机名,可以使用另一种方法.

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

您可以在此处阅读有关标头mod_proxy(以及可能的其他标准代理服务器)的信息:

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html

  • 对.它对我也有用.但是我遇到了一个案例,我需要原始主机名和代理传递的主机名.所以在这里添加这个以供将来参考. (2认同)