通配符子域名 apache vhost 无法加载我的网站文件夹

通配符子域名 apache vhost 无法加载我的网站文件夹

我在让 Apache 虚拟主机加载服务器上的正确文件夹时遇到了一些问题。我正在为我的平台构建公共状态页面功能,其中一项功能是允许用户指定他们自己域的自定义子域,该子域会加载我平台上的状态页面。

我通过一台服务器运行所有内容,我的网站、后端和我的公共状态页面,所有这些都使用 apache 虚拟主机来加载这些文件夹。

为此,我有两个 cloudflare 帐户,我们将它们称为客户和公司(其中我是公司)。

我当前的状态页面存在于 status.company.com 上,它通过 Cloudflare 运行,它是指向我的服务器 IP 的 A 记录。

不过,我想为客户提供一个不同的 URL,以防情况发生变化,因此我创建了一个指向 status.company.com 的 psp.company.com CNAME 记录(无代理),并创建了以下虚拟主机:

<VirtualHost *:80>
  ServerName psp.company.com
  ServerAlias *.psp.company.com
  DocumentRoot /var/www/company-status-pages/dist

  ErrorLog /var/log/httpd/psp.company-error.log
  CustomLog /var/log/httpd/psp.company.com-access.log combined
</VirtualHost>

当我在浏览器中访问 status.company.com 或 psp.company.com 时,我会看到预期的结果,即我的状态页面网站,但当我出于某种原因访问 psp.company.com 时,它们都是非 HTTPS。

接下来,客户端将拥有一个与我的系统分开的网站,他们的 DNS 通过他们自己的 cloduflare 帐户运行,我已指示他们创建他们选择的 CNAME 记录,他们创建了指向 psp.company.com 的 status.client.com,没有代理。

当他们加载 status.client.com 时,他们确实会到达我的服务器,但它不会加载状态页面,而是加载 apache 默认网络服务器页面,这不是预期的结果,因为我已经创建了*通配符子域部分。

我遗漏了什么?我怎样才能让 SSL 也能正常工作?我使用的是 Apache 2.4

答案1

我觉得你误解了别名记录(规范名称)DNS 记录。

你可以想一个别名记录记录为别名到另一个现有的 DNS 条目。让我们看看当客户输入 URL 时会发生什么http://status.client.com进入他们的浏览器:

  • DNS 名称status.client.com由 DNS 服务器解析,返回 CNAME 记录,导致psp.company.com
  • DNS 名称psp.company.com由 DNS 服务器解析,返回A记录指向您的网络服务器的 IP 地址。
  • 浏览器向你的 Web 服务器发送一个 HTTP 请求,请求内容如下:主持人HTTP 请求标头设置为status.client.com
  • Web 服务器没有服务器名称也不服务器别名匹配主持人请求的字段,仍然是status.client.com

我希望这能解释为什么请求没有像你预期的那样工作。基本上,这只是对@dave_thompson_085 在他的评论中所写内容的详细解释。他在评论中回答了这个问题。

您只能将 Web 服务器配置为对您知道请求域名的请求做出反应。唯一的例外是默认的 catch all 条目,没有服务器名称服务器别名并且您只能拥有其中之一。

但你可以对子文件夹像这样的请求:

<VirtualHost *:80>
    ServerName client.com
    ServerAlias *.client.com
    DocumentRoot /var/www/html

    <Location "/status">
        Options FollowSymLinks
        # Add more directives specific to the subfolder
    </Location>
</VirtualHost>

如果您不想根据客户的特定子域调整配置,这可能是更好的选择。

答案2

补充一下 @Andreas 用非常简单的术语解释的内容,您可以在单独的文件中配置虚拟主机(也称为默认 Apache 虚拟主机),只需确保将文件重命名为000-default.confDocumentRoot在其中添加您的即可。每当您的 Web 服务器无法找到匹配的ServerName或时ServerAlias,它将默认使用此特定配置并提供您的状态页面

相关内容