在我的虚拟主机上有两个proxypass规则,一个指向本地varnish实例进行caching,我希望启用ProxyPreserveHost,另一个指向第三方托pipe的站点,我希望禁用ProxyPreserveHost。 无论如何,我可以在每个规则/传球的基础上做到这一点?
在Apache 2.2下,no – ProxyPreserveHost指令仅在服务器configuration或虚拟主机上下文中有效 ; 您需要将不同的ProxyPass语句放在不同的虚拟主机中。
在Apache 2.4中,是的 – 目录上下文已被添加为指令 ,所以你现在可以做一些事情,如:
<Location /to-varnish/> ProxyPreserveHost On ProxyPass http://127.0.0.1:8000/to-varnish/ </Location> <Location /to-third-party/> ProxyPreserveHost Off ProxyPass http://third-party-site.com/ </Location>
你可以借助RequestHeader
ProxyPreserveHost On <LocationMatch third-party-pattern> RequestHeader set Host third-party-vhost-name ProxyPassMatch http://third-party-server </LocationMatch> <LocationMatch varnish-pattern> ProxyPassMatch http://varnish-server </LocationMatch>
我无法赞成索林的回应
在我们运行Apache 2.2的本地情况下,主应用程序需要proxypreservehost(CQ / AEM作者)才能login,但是我们代理的合作伙伴需要在主机头中包含主机。
我们不需要用正则expression式来做这件事,一个普通的<Location...>工作正常。
从文档( http://httpd.apache.org/docs/2.2/mod/core.html#location ):
该指令通过URL限制所附指令的范围。
这个解决scheme适用于我们:
<Location /[path]/ > RequestHeader set Host [thirdparty] </Location> RewriteRule ^/[path]/(.*) https://[thirdparty]/$1 [P,NC,L]
这将此请求的主机头设置为伙伴的主机名。
有了这个,我们可以继续使用他们期望的主机头login到CQ / AEM作者和代理到合作伙伴服务。