Tomcat server.xml 不适用于多个主机

Tomcat server.xml not working for multiple hosts

我正在将请求从 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 的请求 - 仅适用于 Engine 元素的 defaultHost 属性中设置的域。

如果我将 defaultHost 设置为域 BBB,则第二个主机 url 有效。

好像Tomcat没有收到原始域名,无法确定目标域,因此使用默认域名。

我正在通过 Apache 转发请求 mod_proxy 并且根据我设置 defaultHost 的方式接收请求。

这是我的代理命令

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

我检查了访问日志和请求(甚至是非工作请求)正在到达 Tomcat。

我检查了 Tomcat 收到的 x-forwarded-host 和 x-forwarded-server headers,它们分别是 'www' 和不正确的......以及使用的域名。

我认为 Tomcat 应该能够使用该信息找到合适的主机。

您正在寻找的是 ProxyPreserveHost 指令,它在对代理服务器的请求中使用原始请求的 Host header:

ProxyPreserveHost On

使用默认配置,Host header 设置为 ProxyPass 指令中写入的任何内容。在您的情况下,它是 localhost,并且由于 Tomcat 没有该名称的 Host,请求被转发到默认主机。

备注:在您的情况下,使用 mod_proxy_ajp and open an AJP connector on Tomcat. Using AJP Tomcat will receive (by default) all the information (IP address, hostname, server port, protocol used, etc.) of the original request, whereas with HTTP you'll need something like RemoteIpValve for Tomcat 来检索该信息会更容易。