You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian9下Apache2子域名虚拟主机被主域名覆盖的问题求助

解决Apache虚拟主机被覆盖的问题

这种情况我碰到过好多次,本质是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:27:59