我们使用的第三方服务器似乎无法正确处理逗号分隔的X-FORWARDED-HOST值。总之,当通过代理访问时,它会生成包含无效URL的HTML页面,如http://externalsite_address, internalsite_address/blah/blah/blah
(此方案将在http://forums.arcgis.com/threads/66787-Multiple-Reverse-Proxies?p=306157中详细介绍)。在组织上,我们别无选择,只能使用这个第三方服务器而且它不是开源的,所以我们自己无法解决任何问题。我已经尝试了两周时间来克服这个问题但是,鉴于我们组织的网络架构,仍然无法按需要开展工作。我们希望在这些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?到目前为止,我所阅读的所有内容都表明VirtualHost需要不同的地址或端口,并且不能与组织使用相同的地址。也就是说,我们仍然需要人们通过http://externalsite_address/atlas
访问我们的内部服务器,因此我不认为在这里设置VirtualHost是一种选择......我是正确的还是只是误解了文档?
假设我不能使用ProxyPreserveHost指令,因为它只在服务器配置或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。因此,有时主机值应为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