我正在设置一个具有多个虚拟主机的 apache2 服务器。
除 www.mydomain.com 外,它们都可以正常工作,它转到默认虚拟主机而不是我为其创建的虚拟主机。
虚拟主机文件(www.mydomain.com.conf)如下所示:
<VirtualHost *:80>
ServerName www.mydomain.com
ServerAdmin [email protected]
DocumentRoot /var/www/mydomain.com/www
ErrorDocument 404 "/error.php"
</VirtualHost>
如果我将其更改ServerName
为,www2.mydomain.com
它就可以正常工作。如果我将其改回,www.mydomain.com
它将转到默认虚拟主机。
默认虚拟主机文件(000-default.conf)如下所示:
<Virtualhost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/mydomain.com/html
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/mydomain.com/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
需要注意的另一件事可能会影响这一点,那就是服务器的主机名(/etc/hostname)是 www.mydomain.com
这是www.
特殊情况吗?为什么会发生这种情况?我该如何让它按我想要的方式工作?
我正在使用 Ubuntu 16.04,Apache2 服务器版本:Apache/2.4.18 (Ubuntu)
编辑:我已确认问题出在 /etc/hostname 中有 www.mydomain.com - 我将其更改为 www-server.mydomain.com,现在 www 虚拟主机转到了正确的位置。我仍然不知道为什么会发生这种情况。
答案1
我记得,如果未设置 ServerName,Apache 将使用服务器主机名作为默认虚拟主机的 ServerName,您还应该在 Apache 日志中或重新启动 Apache 时的输出中看到有关该警告。
您还可以通过在 Apache conf 中将 ServerName 指令添加到默认虚拟主机或全局添加来解决此问题,但我认为最佳做法是使用专用主机名(如 srv-something.example.com)来命名服务器。
答案2
如果未指定 ServerName,服务器将尝试通过首先向操作系统询问系统主机名来推断客户端可见的主机名,如果失败,则对系统上存在的 IP 地址执行反向查找。
但是,在其他问题中,您需要查看授权方案。看起来您没有授予对新虚拟主机的访问权限,同时使用过时的指令作为默认设置。
您应该确保mod_authz_core
已启用它并将其添加到新的虚拟主机配置中:
<Directory /var/www/mydomain.com/www>
Require all granted
</Directory>
此外,默认配置中的所有这些Order allow,deny
和allow from all
jazz 都是已弃用的 Apache 2.2 内容,应更改为使用 Apache 2.4Require 指令。
为了安全起见,您的主目录apache2.conf
(或security.conf
,或者您想要处理这些事情的地方)应该包括:
<Directory />
Require all denied
</Directory>