Tomcat 将所有子域转发到虚拟主机

Posted

技术标签:

【中文标题】Tomcat 将所有子域转发到虚拟主机【英文标题】:Tomcat forward all subdomains to virtual host 【发布时间】:2016-09-02 17:41:00 【问题描述】:

我有一个 Tomcat 服务器,上面有 4 个网站。

我使用虚拟主机来实现这一点。 但现在我需要将“所有”子域转发到单个主机。

即在我想要的 serveral.xml 中,

  <Host name="www.acme2.com"  appBase="acme2"
        unpackWARs="true" autoDeploy="false">
    <Alias>acme2.com</Alias>
    <Alias>*.acme2.com</Alias>
  </Host>

我知道我可以逐个添加子域,但我希望“所有”子域使用相同的应用程序。我的 DNS 将所有子域转发到服务器 IP。

这适用于我的默认主机,因为所有子域都会发送到它,但我希望每个虚拟主机子域都发送到它自己的应用程序。

【问题讨论】:

你试过用nginx做代理服务器吗?您可以使用 nginx 轻松配置子域。 寻找 Tomcat 解决方案 【参考方案1】:

来自VirtualHost Examples

在一个 IP 地址上运行多个基于名称的网站。

您的服务器有一个 IP 地址,并且多个别名 (CNAMES) 在 DNS 中指向这台机器。您想在这台机器上为www.example1.comwww.example2.org 运行一个Web 服务器。

注意

在您的 Apache 服务器上创建虚拟主机配置不会神奇地导致为这些主机名创建 DNS 条目。您必须在 DNS 中有名称,解析为您的 IP 地址,否则其他人将无法看到您的网站。您可以将条目放在 hosts 文件中以进行本地测试,但这仅适用于具有这些 hosts 条目的机器。

服务器配置

# Ensure that Apache listens on port 80

    Listen 80

# Listen for virtual host requests on all IP addresses

    NameVirtualHost *:80

    <VirtualHost *:80>
    DocumentRoot /www/example1
    ServerName www.example1.com

# Other directives here

    </VirtualHost>

    <VirtualHost *:80>
    DocumentRoot /www/example2
    ServerName www.example2.org

# Other directives here

    </VirtualHost>

星号匹配所有地址,因此主服务器不提供任何请求。由于 www.example1.com 在配置文件中排在第一位,因此它的优先级最高,可以被视为默认或主服务器。这意味着,如果收到的请求与指定的 ServerName 指令之一不匹配,它将由第一个 VirtualHost 提供服务。

注意

如果您愿意,可以将* 替换为系统的实际 IP 地址。在这种情况下,VirtualHost 的参数必须与

的参数匹配

名称虚拟主机:

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>
# etc ...

但是,在 IP 地址不可预测的系统上使用 * 也很有用 - 例如,如果您的 ISP 有一个动态 IP 地址,并且您正在使用各种动态 DNS 解决方案。由于 * 匹配任何 IP 地址,因此只要您的 IP 地址发生更改,此配置就可以正常工作。

上述配置是您希望在几乎所有基于名称的虚拟主机情况下使用的配置。实际上,此配置唯一不起作用的情况是,当您基于不同的 IP 地址或端口提供不同的内容时。

资源链接:

    url redirection/mapping of the same java web application to multiple sub-domains Two domain & their sub-domain are mapped to the same IP so how can i host my different application to the same tomcat server? How to host random or wildcard subdomains on Tomcat and Java ? Multiple Subdomains in Apache / Tomcat with mod_jk

【讨论】:

寻找tomcat解决方案【参考方案2】:

使用nginx 配置重定向。在域配置文件中,您可以指定

server 
  server_name *.domain.com;
  return 301 http://domain.com$request_uri;

从子域重定向到域。

nginx 网站有一个很好的Getting Started 指南。

【讨论】:

以上是关于Tomcat 将所有子域转发到虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 与子域共享主机

使用 .htaccess 将 URL 重定向到子域

Apache 虚拟主机不适用于子域

DNS解析与Bind的使用——子域授权转发及访问控制列表配置

nginx 转发请求到多台tomcat

如何将日志从 docker 容器转发到主机 journald/syslog 服务?