我的子域名的虚拟主机文件未被选中

我的子域名的虚拟主机文件未被选中

所以我有一个在 Ubuntu 上的 lamp 堆栈上运行的网站。

我有两个 vhosts 文件...

000-默认.conf:

<VirtualHost *:80>
    ServerName www.example.co.uk
        ServerAdmin [email protected]
        DocumentRoot /var/www/html/

        ErrorLog ${APACHE_LOG_DIR}/site-a_error.log
        CustomLog ${APACHE_LOG_DIR}/site-a_access.log combined
</VirtualHost>

以及 moodle.example.co.uk.conf:

<VirtualHost *:80>
    ServerName moodle.example.co.uk
        ServerAdmin [email protected]
        DocumentRoot /var/www/moodle.example.co.uk/public_html

        ErrorLog ${APACHE_LOG_DIR}/site-b_error.log
        CustomLog ${APACHE_LOG_DIR}/site-b_access.log combined
</VirtualHost>

如果我访问 www.example.co.uk,我会看到主页。正如预期的那样。

但是,如果我访问 moodle.example.co.uk,我仍然会看到主页,而不是存储在指定的 DocumentRoot 中的页面。

如果我向 Moodle 配置中添加 ServerAlias 指令,那么它就可以正常工作。

为什么 ServerName 指令不起作用?

编辑:更新。如果我禁用所有虚拟主机,我的网站仍然可用。这似乎是非常奇怪的行为。

访问记录在 other_vhosts_access.log 中,但我找不到导致这种行为的任何原因。

如果没有定义虚拟主机,站点是否应该只给出连接被拒绝错误?

答案1

来自 Apache 2.4 文档(可能有帮助):

当请求到达时,服务器将根据请求使用的 IP 地址和端口找到最佳(最具体)匹配参数。如果有多个虚拟主机包含此最佳匹配地址和端口组合,Apache 将进一步将 ServerName 和 ServerAlias 指令与请求中存在的服务器名称进行比较。

如果您从任何基于名称的虚拟主机中省略 ServerName 指令,则服务器将默认使用从系统主机名派生的完全限定域名 (FQDN)。这种隐式设置的服务器名称可能会导致违反直觉的虚拟主机匹配,因此不建议这样做。

下面的代码非常有趣:“如果你省略了 ServerName 指令任何基于名称的虚拟主机,服务器将默认使用从系统主机名派生的完全限定域名 (FQDN)”

相关内容