子域的虚拟主机覆盖默认虚拟主机

Cho*_*hoy 1 virtualhost apache-2.2

我在 Apache 中设置了两个虚拟主机。一种默认用于处理所有请求,一种用于特定子域。www目录设置如下:

/var/www
/var/www/subdomain
Run Code Online (Sandbox Code Playgroud)

虚拟主机配置如下:

<VirtualHost *:80>
        DocumentRoot /var/www
        <Directory />
                Options None
                AllowOverride None
        </Directory>
        <Directory /var/www>
                Options None
                AllowOverride None
                Deny from all
        </Directory>
</VirtualHost>


<VirtualHost subdomain>
        ServerName subdomain.domain.com

        DocumentRoot /var/www/subdomain
        <Directory /var/www/subdomain>
                Options None  FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

现在,我希望subdomain.domain.com可以提供/var/www/subdomain任何服务,并拒绝任何其他请求。但是,当我访问 domain.com 时,它提供/var/www/subdomain.

感谢有人能告诉我我做错了什么。谢谢!


运行时编辑额外信息 apache2ctl -S

/usr/sbin/apache2ctl: 87: ulimit: error setting limit (Operation not permitted)
apache2: Could not reliably determine the server's fully qualified domain name, using XX.XXX.XXX.XX for ServerName
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server domain (/etc/apache2/sites-enabled/default:1)
         port 80 namevhost domain (/etc/apache2/sites-enabled/default:1)
         port 80 namevhost sub.domain.com (/etc/apache2/sites-enabled/subdomain:1)
Syntax OK
Run Code Online (Sandbox Code Playgroud)

Sha*_*den 7

你的问题在这里:

<VirtualHost subdomain>
Run Code Online (Sandbox Code Playgroud)

不要那样做,因为无论解析到哪个 IP,它都会赋予该虚拟主机优先于现有虚拟主机的优先级。它应该<VirtualHost *:80>与您现有的虚拟主机匹配。该ServerName指令是虚拟主机的“名称”应该去的地方。

你还需要一个NameVirtualHost *:80地方,如果你还没有的话。