Apache通过ServerAlias实现子域名泛解析,核心是用ServerAlias *.example.com声明通配规则,配合DNS泛解析A记录;ServerName仅设一个主域名,HTTP与HTTPS需分别配置且各自重复声明ServerAlias。
Apache 通过 ServerAlias 匹配多个子域名,核心是用通配符 *.example.com 声明泛解析规则,并配合 DNS A 记录指向服务器 IP。它不靠写死每个子域,而是让一个 <VirtualHost> 块统一响应所有匹配的子域名请求。
在虚拟主机配置中,ServerName 只能设一个主域名(如 example.com),而子域名泛匹配全靠 ServerAlias:
ServerAlias *.example.com —— 星号前必须带英文点,表示“任意一级子域名”ServerAlias *.staging.example.com 或 ServerAlias *.dev.example.com
ServerAlias *example.com、ServerAlias example.*、ServerAlias www.*.example.com —— Apache 不识别这些格式ServerAlias www.example.com blog.example.com *.example.com
ServerAlias *.example.com 生效的前提,是 DNS 层面已为该泛域添加 A 记录:
*、记录值为服务器公网 IP 的 A 记录hosts 文件模拟泛解析(127.0.0.1 *.example.com 无效),只能逐条加,比如:127.0.0.1 a.example.com
127.0.0.1 b.example.com
只写 ServerAlias 不起作用,整个虚拟主机块必须完整,且依赖模块已启用:
a2enmod rewrite(必要);若要用动态子目录(如 a.example.com → /var/www/a),还需 a2enmod vhost_alias
/etc/httpd/conf/httpd.conf 中有未注释的:LoadModule rewrite_module modules/mod_rewrite.so
如需泛目录映射,再加:
LoadModule vhost_alias_module modules/mod_vhost_alias.so
Apacheconfhttpd.conf,取消以下两行注释:LoadModule vhost_alias_module modules/mod_vhost_alias.so
Include conf/extra/httpd-vhosts.conf
80 端口和 443 端口是两个独立的虚拟主机上下文,ServerAlias 不能复用:
ServerAlias *.example.com,HTTPS 块里也必须再写一遍https://test.example.com 时匹配失败,可能跳转到默认站点或返回 404SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem