我们使用的第三方服务器似乎没有正确处理逗号分隔的X-FORWARDED-HOST值 . 总之,当通过代理访问时,它会生成包含无效URL(如 http://externalsite_address, internalsite_address/blah/blah/blah )的HTML页面(此场景将在以下位置详细介绍:http://forums.arcgis.com/threads/66787-Multiple-Reverse-Proxies?p=306157) . 在组织上,我们别无选择,只能使用这个第三方服务器,而且我们自己解决了这个问题 . 我已经尝试了两个星期来解决这个问题但是,鉴于我们的组织's web architecture, still can' t按需要开始工作 . 我们希望在这些HTML的网址中看到的是 http://externalsite_address/blah/blah/blah .

在测试环境中,我了解到我可以根据需要通过为充当外部站点的服务器设置ProxyPreserveHost On然后在内部站点上添加指令“RequestHeader unset X-Forwarded-Host”来使工作正常工作 . 这一切都很好 . 不幸的是,真正的外部站点的配置是我们组织中所有其他服务器的代理服务器,我们被拒绝引入这样的服务器配置更改,因为它可能会影响组织中其他内部服务器上存在的其他应用程序 .

在查看ProxyPreserveHost的文档时,我发现它也可以在VirtualHost的上下文中设置 . 但是,在这种情况下,我不确定如何定义类似的东西 . 进入我们组织的所有网络流量必须通过此externalsite_address进行路由,并且只有一个RewriteRule通过代理将适当的流量转发到我们的特定internalsite_address,如下所示:

RewriteRule ^/atlas(.*)$ http://internalsite_address/atlas$1 [P,L,QSA]

有没有什么方法可以将其定义为具有ProxyPreserveHost On的VirtualHost?我所使用的所有东西都与组织的地址相同 . 也就是说,我们仍然需要人们通过 http://externalsite_address/atlas 到达我们的内部服务器,所以我不认为在这里设置VirtualHost是一种选择......我是正确还是只是误解了文档?

假设我只能在我们的内部服务器上试图找到某种方法来实现这一点 . 我找到Can I turn off an Apache Directive then turn it on in an include?,建议这段代码:

<Proxy "http://${build.replace.host}/">
  RequestHeader set Host ${build.replace.external.host}
</Proxy>
RewriteRule      ^/proxypath/ http://${build.replace.external.host}/path/to/resource.html [P]
ProxyPassReverse /proxypath/ http://${build.replace.external.host}/path/to/resource.html

但是,我无法弄清楚如何正确设置Host值,因为虽然外部用户必须通过我们的externalsite_address,但我们的内部用户可以,可以并且必须继续直接通过我们的internalsite_address . 所以,有时候Host值应该说 http://externalsite_address/ ,其他时候 http://internalsite_address/ . 真的,我希望能够做什么(但不知道如何或是否可能)是以某种方式确定是否设置了X-FORWARDED-HOST值,如果是,则将 Headers 中的主机设置为字符串中列出的第一个值,然后,如有必要,打开ProxyPreserveHost,以便通过后续代理维护该值 .

我发现解决这个问题的另一种方法是在我们的外部服务器上引入另一个代理定义,该定义直接发送到给定特定URL的第三方服务器,如下所示(请注意“atlas”之后的“rest”,它始终存在于请求中最终由该服务器处理):

RewriteRule ^/atlas/rest/(.*)$ http://internalsite_address/atlas/rest/$1 [P,L,QSA]

不幸的是,这样做需要通过防火墙向系统架构的另一个区域戳一个洞,这也被拒绝了 . 外部服务器可以代理到我们的内部服务器(位于同一区域),我们的内部服务器(外部不直接可见)是唯一一个具有所有权限,允许请求到达所有其他服务器的服务器用于传递存在于另一个区域中的Web应用程序 . 请不要让我证明任何这一点,架构是由我们决定的,我们只是想弄清楚如何在其中工作 .

任何人都可以提出任何可以帮助我实现我想在这里完成的事情吗?即使是我还没找到的东西?或者,是否有某种方法可以在外部服务器上定义VirtualHost,因此我可以仅为那些路由到我们内部服务器的请求设置ProxyPreserveHost标志?

真的,在这一点上,我很欣赏任何线索......

干杯,jtm