动态虚拟主机通过mod_vhost_alias模块和VirtualDocumentRoot指令,根据Host头自动映射域名到对应目录(如blog.example.com→/var/www/blog/public_html),无需为每个子域单独配置VirtualHost。

Apache 动态虚拟主机(Dynamic Virtual Hosts)不是靠写死每个 <virtualhost></virtualhost> 块,而是用通配符、正则或模块自动匹配域名并映射到对应目录。它适合托管大量子域名(如 user1.example.com、user2.example.com)或快速上线新站点的场景,避免每次新增都要改配置、重载服务。
什么是动态虚拟主机
传统虚拟主机需为每个域名单独定义一个 <virtualhost></virtualhost> 区块;而动态方式通过规则“推导”路径,比如:
- 访问
blog.example.com→ 自动指向/var/www/blog/ - 访问
shop.example.com→ 自动指向/var/www/shop/ - 访问
xxx.example.com→ 自动指向/var/www/xxx/(无需预创建配置)
核心依赖:mod_vhost_alias 模块(Apache 自带,但默认可能未启用)和正确的 VirtualDocumentRoot 指令。
启用 mod_vhost_alias 并确认支持
先检查模块是否已加载:
sudo a2enmod vhost_alias # Ubuntu/Debian # 或 sudo httpd -M | grep vhost_alias # CentOS/RHEL,看输出是否有 vhost_alias_module
若未启用,编辑主配置文件(如 /etc/apache2/apache2.conf 或 /etc/httpd/conf/httpd.conf),确保有这一行(取消注释):
LoadModule vhost_alias_module modules/mod_vhost_alias.so
保存后运行语法检查:
sudo apache2ctl -t # Ubuntu/Debian sudo httpd -t # CentOS/RHEL
输出 Syntax OK 才可继续。
配置基于域名的动态根目录
在站点配置文件中(如 /etc/apache2/sites-available/dynamic.conf),写入:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
ServerName example.com
ServerAlias *.example.com
<pre class="brush:php;toolbar:false;"># 核心:根据 Host 头自动设置 DocumentRoot
VirtualDocumentRoot /var/www/%-2+/public_html
# %-2+ 表示倒数第二个点之后的部分,即 blog.example.com → blog;shop.example.com → shop
<directory>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</directory>
ErrorLog ${APACHE_LOG_DIR}/dynamic_error.log
CustomLog ${APACHE_LOG_DIR}/dynamic_access.log combined
说明:
-
%-2+是最常用变量:对user.blog.example.com取user.blog;blog.example.com取blog -
%-3+可取三级子域,如api.v1.example.com→api.v1 - 目录结构需提前建好,例如:
/var/www/blog/public_html/index.html
启用配置并验证
Ubuntu/Debian 执行:
sudo a2ensite dynamic.conf sudo systemctl reload apache2
CentOS/RHEL 执行:
sudo cp dynamic.conf /etc/httpd/conf.d/ sudo systemctl reload httpd
然后在本地 /etc/hosts 添加测试条目:
127.0.0.1 blog.example.com 127.0.0.1 shop.example.com
浏览器访问 http://blog.example.com,应看到对应目录下的页面。注意:域名必须真实解析或 hosts 映射,否则浏览器根本不会发 Host 头。
不复杂但容易忽略:动态虚拟主机依赖 Host 请求头,所以不能用于纯 IP 访问或未带 Host 的旧客户端;同时目录权限、SELinux(如开启)、防火墙策略仍需按常规检查。










