Кот server.xml не работает для нескольких хостов

#tomcat #mod-proxy

Вопрос:

Я перенаправляю запросы с Apache на Tomcat.

 <Server>
<Service>
    <Connector port="8222" protocol="HTTP/1.1" proxyPort="80" />

   <Engine name="Catalina" defaultHost="www.AAA.com">
            <Host name="www.AAA.com">
                 <Context path="/path" docBase="aaa"></Context>
            </Host>

            <Host name="www.BBB.com">
                 <Context path="/path" docBase="bbb"></Context>
            </Host>
   </Engine>
</Service>
</Server>

 

Запросы через Apache — работают только для домена, заданного в атрибуте defaultHost элемента Engine.

Если я установлю defaultHost для домена BBB, то будут работать URL-адреса второго хоста.

Это почти так же, как если бы Tomcat не получал исходное доменное имя и не мог определить целевой домен и, следовательно, использовал значение по умолчанию.

Я пересылаю запросы через Apache mod_proxy, и запросы принимаются в зависимости от того, как я установил defaultHost.

Это моя прокси-команда

 ProxyPass         /path http://localhost:8222/path
ProxyPassReverse  /path http://localhost:8222/path
 

Я проверил журналы доступа, и запросы (даже нерабочие) поступают в Tomcat.

Я проверил заголовки x-переадресованного хоста и x-переадресованного сервера, полученные Tomcat, и они верны с » www » и без соответственно…вместе с используемым доменным именем.

Я бы подумал, что Tomcat должен быть в состоянии найти нужного хоста с этой информацией.

Ответ №1:

То, что вы ищете, — это ProxyPreserveHost директива, которая использует Host заголовок исходного запроса в запросах на прокси-серверы:

 ProxyPreserveHost On
 

При конфигурации по умолчанию Host заголовок устанавливается в соответствии с тем, что написано в ProxyPass директиве. В вашем случае это localhost так, и поскольку Tomcat не имеет Host такого имени, запрос перенаправляется на хост по умолчанию.

Примечание: в вашем случае было бы проще использовать mod_proxy_ajp и открывать разъем AJP на Tomcat. Используя AJP, Tomcat получит (по умолчанию) всю информацию (IP-адрес, имя хоста, порт сервера, используемый протокол и т. Д.) Исходного запроса, Тогда как при использовании HTTP вам понадобится что-то вроде RemoteIpValve Tomcat для получения этой информации.

Комментарии:

1. Большое спасибо!