apache实现通配二级域名自动路由需三者缺一不可:dns泛解析、启用mod_vhost_alias模块、配置virtualdocumentroot并关闭usecanonicalname;目录权限与servername/serveralias协同生效。

Apache 本身不直接支持“通配二级域名自动路由到同名目录”这种行为,ServerName 单独无法实现泛解析。它必须和 mod_vhost_alias 模块 + VirtualDocumentRoot 配合,再配合 DNS 泛解析,三者缺一不可。
1. DNS 层先做泛解析(基础前提)
在域名控制台添加一条 A 记录:
- 主机名填
*(星号) - 记录值填你的服务器公网 IP
- 确保 TTL 合理,等待生效(可用
dig test123.example.com验证)
2. Apache 开启并配置 vhost_alias 模块
仅靠 ServerAlias *.example.com 只能匹配请求头,但不会自动切换网站根目录。要让 shop.example.com 自动指向 /var/www/shop 这类路径,必须启用动态虚拟主机模块:
- Debian/Ubuntu:运行
a2enmod vhost_alias,然后重启 Apache - CentOS/RHEL:确认
LoadModule vhost_alias_module modules/mod_vhost_alias.so已取消注释 - 关键配置项:
UseCanonicalName Off—— 否则 Apache 会忽略客户端发来的 Host 头,%1就取不到子域名
3. VirtualHost 中用 VirtualDocumentRoot 实现自动映射
一个典型配置示例:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
ServerName example.com
ServerAlias *.example.com
UseCanonicalName Off
VirtualDocumentRoot /var/www/%1
<directory>
Require all granted
Options FollowSymLinks
AllowOverride All
</directory></virtualhost>
说明:
-
%1表示 Host 头中第一个点号前的部分,即shop.example.com→shop - 若想匹配三级域如
cn.shop.example.com,可用%-2取倒数第二段 - 对应目录如
/var/www/shop必须存在,且 Apache 用户(如 www-data)有读+执行权限
4. 注意 ServerName 和 ServerAlias 的定位
它们在这里主要起“接收流量入口”的作用,不是路由逻辑本身:
-
ServerName example.com是必需的占位符,不能省略 -
ServerAlias *.example.com告诉 Apache:所有带 .example.com 后缀的 Host 请求都进这个 VirtualHost - 不支持
ServerAlias *.sub.example.com或example.*这类写法
不复杂但容易忽略:DNS 泛解析、mod_vhost_alias 启用、UseCanonicalName 关闭、目录权限四者齐备,才能真正跑通。










