Debian9下Apache2子域名虚拟主机被主域名覆盖的问题求助
这种情况我碰到过好多次,本质是Apache虚拟主机的匹配规则在搞鬼——它会按配置文件的加载顺序处理请求,如果你的test.dev.domain.sk没有被任何虚拟主机精确匹配到,Apache就会自动用第一个加载的dev.domain.sk配置作为默认站点,这就是为什么禁用第一个配置后test站点能正常显示。
下面是一步步的排查和解决方法:
1. 检查虚拟主机的ServerName和ServerAlias配置
这是最关键的一步,必须确保每个虚拟主机都有精确且唯一的ServerName,避免模糊匹配导致的覆盖。
编辑
dev.domain.sk的配置文件(比如/etc/apache2/sites-enabled/dev.conf):<VirtualHost *:80> # 明确指定主域名 ServerName dev.domain.sk ServerAdmin webmaster@dev.domain.sk DocumentRoot /var/www/dev.domain.sk/public_html # 如果你需要给这个域名加别名,用ServerAlias,比如: # ServerAlias www.dev.domain.sk # 其他日志、权限等配置... </VirtualHost>再编辑
test.dev.domain.sk的配置文件(比如/etc/apache2/sites-enabled/test.conf):<VirtualHost *:80> # 明确指定子域名 ServerName test.dev.domain.sk ServerAdmin webmaster@test.dev.domain.sk DocumentRoot /var/www/test.dev.domain.sk/public_html # 同样,按需添加别名 # ServerAlias www.test.dev.domain.sk # 其他配置... </VirtualHost>
⚠️ 重点:别在dev.domain.sk的配置里加类似ServerAlias *.domain.sk的通配符,这会直接匹配所有domain.sk的子域名,包括test.dev.domain.sk,导致覆盖。
2. 确认配置文件的加载顺序
Apache在sites-enabled目录下是按文件名的字母顺序加载配置的(比如000-dev.conf会比test.conf先加载)。不过只要你给每个虚拟主机都设置了精确的ServerName,加载顺序就不会影响精确匹配的请求——只有当请求的域名没被任何ServerName/ServerAlias命中时,才会用第一个加载的配置作为默认。
如果你担心默认主机的问题,可以专门创建一个默认虚拟主机(比如命名为000-default.conf),用来处理所有未匹配的请求,避免影响你的业务站点。
3. 验证配置并重启Apache
修改完配置后,先检查语法是否正确:
sudo apache2ctl configtest
如果输出Syntax OK,就重新加载Apache使配置生效:
sudo systemctl reload apache2
4. 查看日志排查问题
如果还是有问题,去Apache的日志目录看看请求记录:
- 访问日志:
/var/log/apache2/access.log——可以看到每个请求被分配到了哪个虚拟主机 - 错误日志:
/var/log/apache2/error.log——排查配置是否有隐藏错误
通过日志你能清楚看到test.dev.domain.sk的请求到底被哪个虚拟主机处理了,进一步定位问题。
内容的提问来源于stack exchange,提问作者tomsk

