Apache 中基于 CNAME 且带有通配符域的 VirtualHost

Apache 中基于 CNAME 且带有通配符域的 VirtualHost

我需要使用 Apache 来实现这样的配置,希望得到一些建议。

我有一个域名:example.com。我们在 /var/www/html 下部署了一个可通过 www.example.com 访问的网站。此外,我们允许用户注册并访问内容(这些用户随后成为我们的租户)。这些特定于租户的内容部署在 /var/www/tenants 下。对于每个租户,我们为他们创建一个子域。例如,对于租户 A,我们创建 tenanta.example.com。每次导航到该 URL 时,他都可以访问特定于租户 A 的一些内容。

现在租户 A 想要为 tenanta.example.com 设置一个虚荣域名。假设虚荣域名为:help.tenanta.com,其中 tenanta.com 是租户 A 注册的域名。他设置了一条 CNAME 记录,将 help.tenanta.com 指向 tenanta.example.com。

现在到了 Apache 部分。如何设置配置文件,以便对 help.tenanta.com 的请求获取 /var/www/tenants 下的内容,而不是 /var/www/html?

以下是我尝试过的:

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName www.example.com
    ServerAlias example.com, cdn.example.com
    # See: http://stackoverflow.com/questions/2297403/http-host-vs-server-name
    UseCanonicalName on

    DocumentRoot /var/www/html
<VirtualHost>

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerAlias *.example.com
    UseCanonicalName on

    DocumentRoot /var/www/tenants
<VirtualHost>

但是在这样的设置下,对 help.tenanta.com 的请求仍然转到 /var/www/html,而不是 /var/www/tenants。

注意:在 serverfault 上已经问过类似的问题,例如:基于CNAME的Apache虚拟主机

,但它们没有解决通配符子域名问题。

答案1

首先,我还要指出的是,使用CNAME记录不是一个因素,基于名称的虚拟主机功能仅基于 HTTPHost标头(即请求 URL 的主机部分)。

如果您的想法是在添加特定于客户的虚荣域时无需调整 Apache httpd 配置即可实现此功能,我认为您无法直接基于基于名称的虚拟主机(即基于ServerName/ ServerAlias)实现此功能。

可行的办法是依靠当没有匹配ServerName/时的默认 vhost 行为ServerAlias

IP 和端口组合的默认基于名称的虚拟主机

如果在包含最具体匹配的 IP 地址和端口组合的虚拟主机集合中未找到匹配的 ServerName 或 ServerAlias,则第一个列出的虚拟主机与之匹配的将被使用。


当然,如果您想通过 HTTPS 提供服务(这越来越被认为是任何类型的服务的强制性要求),则无论如何都需要添加可用于所有这些客户域的证书。
(考虑自动化,而不是适用于所有内容的静态配置。)

相关内容