У меня есть два правила proxypass на моем веб-хосте: одно указывает на локальный экземпляр varnish для целей кэширования, для которого я хочу включить ProxyPreserveHost, а другое указывает на сторонний размещенный сайт, для которого я хочу отключить ProxyPreserveHost. Могу ли я сделать это для каждого правила / прохода?
В 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>
Вы можете с помощью 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), но партнер, к которому мы работаем через прокси, требует своего хоста в заголовке хоста.
Однако нам не нужно делать это с регулярным выражением, обычное <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 И прокси для партнерской службы, используя ожидаемый заголовок хоста.