Ubuntu 22.04下Apache2子域名mail.example.com未匹配对应虚拟主机,触发默认主机的问题排查
嘿,我来帮你捋清楚这个问题的根因和解决办法。从你给出的配置、日志还有apachectl -D DUMP_VHOSTS的输出来看,你怀疑PTR记录影响的思路完全正确!
先拆解下核心问题:
- 你的
0-default.conf和0-default-ssl.conf都没设置ServerName和ServerAlias - Apache有个默认行为:如果虚拟主机没有明确指定
ServerName,它会自动用服务器的系统主机名,或者通过反向解析服务器IP得到的PTR记录值,来填充这个虚拟主机的默认ServerName - 从
DUMP_VHOSTS结果能看到,默认虚拟主机被标记为mail.example.com——这说明你的服务器主机名,或者IP的反向PTR记录就是mail.example.com,Apache自动把这个值赋给了无ServerName的默认虚拟主机
这就触发了优先级冲突:当请求mail.example.com时,Apache会优先匹配精确的ServerName(也就是被自动赋值给默认虚拟主机的mail.example.com),而example.com-ssl.conf里的*.example.com通配符别名优先级低于精确匹配,所以请求被默认主机截胡,用了snakeoil证书才出现不匹配的错误。
解决方案分两步走,非常直接:
1. 给默认虚拟主机明确设置ServerName
编辑/etc/apache2/sites-enabled/0-default.conf,在<VirtualHost *:80>块里添加一行:
ServerName localhost
同样编辑/etc/apache2/sites-enabled/0-default-ssl.conf,在<VirtualHost *:443>块里添加:
ServerName localhost
这样Apache就不会再自动把mail.example.com绑定到默认虚拟主机上了。
2. 重启Apache让配置生效
执行命令:
sudo systemctl restart apache2
之后再跑一遍apachectl -D DUMP_VHOSTS,你会看到默认虚拟主机的ServerName变成了localhost,此时mail.example.com的请求会正常匹配到example.com-ssl.conf里的*.example.com通配符别名,使用你的Let's Encrypt证书。
如果你的场景里完全不需要默认虚拟主机,也可以直接禁用它:
sudo a2dissite 0-default.conf 0-default-ssl.conf sudo systemctl restart apache2
不过保留带明确ServerName的默认主机,能避免后续未匹配的请求出现异常,更稳妥一些。
备注:内容来源于stack exchange,提问作者yaugenka

