24

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

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

提前致谢!

4

3 回答 3

28

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

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

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

于 2011-05-23T18:45:27.550 回答
7

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

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

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

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

于 2013-04-30T02:24:33.087 回答
1

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

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

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

于 2011-05-20T19:59:47.467 回答