2

我们使用的第三方服务器似乎无法正确处理逗号分隔的 X-FORWARDED-HOST 值。总之,它会生成包含无效 URL 的 HTML 页面,例如http://externalsite_address, internalsite_address/blah/blah/blah通过代理访问它时(此方案在以下位置有更详细的描述: http: //forums.arcgis.com/threads/66787-Multiple-Reverse-Proxies?p=306157)。在组织上,我们别无选择,只能使用这个第三方服务器,它不是开源的,所以我们不能自己修复任何东西。我已经尝试了两周来克服这个问题,但是,鉴于我们组织的 Web 架构,仍然无法让事情按预期工作。我们希望在这些 HTML 的 URL 中看到的是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]

有什么方法可以将其定义为一个 VirtualHost,其中 ProxyPreserveHost On ?到目前为止,我所读到的所有内容都表明,VirtualHost 需要不同的地址或端口,并且不能用于与组织相同的地址。也就是说,我们仍然需要人们通过 访问我们的内部服务器http://externalsite_address/atlas,所以我不认为在这里设置 VirtualHost 是一种选择......我是正确的还是只是误解了文档?

假设我不能使用 ProxyPreserveHost 指令,因为它只在服务器配置或 VirtualHost 中有效,我一直试图找出一些方法来仅在我们的内部服务器上完成此操作。我发现我可以关闭 Apache 指令然后在包含中打开它吗?这建议了这个代码:

<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 值,如果是,则将标头中的主机设置为字符串中列出的第一个值,然后,如有必要,打开 ProxyPreserveHost,以便通过后续代理维护该值。

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

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

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

任何人都可以提出任何可以帮助我实现我在这里想要完成的事情的建议吗?甚至我还没有找到的东西?或者,有什么方法可以在外部服务器上定义一个 VirtualHost,这样我就可以只为那些路由到我们内部服务器的请求设置 ProxyPreserveHost 标志?

真的,在这一点上,我会很感激任何线索......

干杯,jtm

4

0 回答 0