Apache 虚拟主机默认为 FQDN

Apache virtualhost defaults to FQDN

我在我的 Apache 系统上设置了一个 VirtualHost,它恰好与服务器的 FQDN 同名。这是 FQDN:

root@mail:/etc/apache2/sites-available# hostname -f
mail.example.com

这是 .conf 文件的内容:

000-default.conf:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

example.com.conf:
<VirtualHost *:80>
    ServerName mail.example.com
    DocumentRoot /home/example/public_html
</VirtualHost>

现在我希望 mail.example.com 会匹配 VirtualHost,因此使用 DocumentRoot /home/example/public_html。 它没有。

运行 apache2ctl -S 产量:

*:80                   is a NameVirtualHost
     default server mail.example.com (/etc/apache2/sites-enabled/000-default.conf:1)
     port 80 namevhost mail.example.com (/etc/apache2/sites-enabled/000-default.conf:1)
     port 80 namevhost mail.example.com (/etc/apache2/sites-enabled/abcarrental.nl.conf:1)

所以默认服务器是 mail.example.com,因此 DocumentRoot 是 /var/www/html。

选择不同的 VirtualHost 名称(例如 webmail.example.com)并将 VirtualHostName 更改为 webmail.example.com 即可解决问题。

我已经浏览了 Apache NamedVirtualHost 手册页,但找不到解释。仅说明如果名称 not 匹配任何虚拟主机,则使用默认值。但如果 FQDM 等于请求的名称,则不会使用默认值。

这是设计使然的行为吗?

是的,当您从系统本地主机名初始化的 VirtualHost 中省略 ServerName 时,这是设计使然,或者禁止从任何本地 IP 地址的反向 DNS 查找。

不幸的是,此配置是由 debian/ubuntu 软件包创建的默认虚拟主机完成的。

事后看来——在 catch-all(第一个列出的)虚拟主机中设置一个完全虚拟的 ServerName 被认为是更可取的。