各个 proxypass 规则上的 ProxyPreserveHost

各个 proxypass 规则上的 ProxyPreserveHost

我的 Web 主机上有两条 proxypass 规则,一条指向本地 varnish 实例以进行缓存,我希望为其启用 ProxyPreserveHost,另一条指向第三方托管网站,我希望为其禁用 ProxyPreserveHost。我能否根据每条规则/pass 执行此操作?

答案1

在 Apache 2.2 下,不需要 - 该ProxyPreserveHost指令是仅在服务器配置或虚拟主机上下文中有效;您需要将不同的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>

答案2

你可以借助 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>

答案3

我无法赞同 Sorin 的回应......

在我们运行 Apache 2.2 的本地情况下,主应用程序需要 proxypreservehost(CQ/AEM 作者)才能登录,但我们代理的合作伙伴需要其主机在主机头中。

但是,我们不需要使用正则表达式来执行此操作,正则<Location...>就可以了。

来自文档(http://httpd.apache.org/docs/2.2/mod/core.html#location):

该指令通过 URL 限制所封闭指令的范围。

这个解决方案对我们有用:

  <Location /[path]/ >
    RequestHeader set Host [thirdparty]
  </Location>
  RewriteRule ^/[path]/(.*) https://[thirdparty]/$1 [P,NC,L]

这会将此请求的主机标头设置为合作伙伴的主机名。

有了它,我们可以继续使用他们的预期主机头登录 CQ/AEM 作者并代理到合作伙伴服务。

相关内容