![通配符子域名 apache vhost 无法加载我的网站文件夹](https://linux22.com/image/786474/%E9%80%9A%E9%85%8D%E7%AC%A6%E5%AD%90%E5%9F%9F%E5%90%8D%20apache%20vhost%20%E6%97%A0%E6%B3%95%E5%8A%A0%E8%BD%BD%E6%88%91%E7%9A%84%E7%BD%91%E7%AB%99%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我在让 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.conf
并DocumentRoot
在其中添加您的即可。每当您的 Web 服务器无法找到匹配的ServerName
或时ServerAlias
,它将默认使用此特定配置并提供您的状态页面