使用VirtualDocumentRoot而非多个<VirtualHost>块,是因为它通过mod_vhost_alias模块实现动态路由,依据Host头实时拼接路径(如%1取首段子域名),避免配置臃肿、重启慢和语法错误,适用于多租户/SaaS场景;需启用模块、禁用默认主机、配置ServerAlias *.example.com及UseCanonicalName Off,并手动添加hosts条目。

为什么用 VirtualDocumentRoot 而不是多个 <VirtualHost> 块
手动为每个二级域名写一个 <VirtualHost> 块,在用户量增长后会迅速失控——配置文件臃肿、重启慢、易出语法错误。而 VirtualDocumentRoot 是 Apache 的动态路由机制,它不依赖预定义的域名列表,而是根据请求 Host 头实时拼接物理路径,适合多租户、SaaS 或用户自注册场景。
关键前提是必须启用 mod_vhost_alias 模块。XAMPP 默认已加载该模块,但需确认 httpd.conf 中这行未被注释:LoadModule vhost_alias_module modules/mod_vhost_alias.so。漏掉这行会导致 Apache 启动失败或直接忽略 VirtualDocumentRoot 指令。
如何正确设置 VirtualDocumentRoot 路径变量
VirtualDocumentRoot 的路径中不能用硬编码目录名,必须用变量占位符(如 %1、%2+、%0)解析 Host 字符串。常见错误是把 %1 当成“第一个子域名”,其实它取的是 Host 中第一个点号前的部分;%2+ 才表示从第二个点号开始的全部内容(含点号),%0 是完整 Host。
- 要让
user1.example.com自动映射到C:/xampp/htdocs/users/user1,应写:VirtualDocumentRoot "C:/xampp/htdocs/users/%1" - 若主域是
example.com,想支持blog.example.com和api.example.com,但又不想和用户目录冲突,可用:VirtualDocumentRoot "C:/xampp/htdocs/sites/%1",再确保example.com本身走默认站点(见下一条) - 路径中一律用正斜杠
/,反斜杠\在 Apache 内部可能被误解析为转义符 - 路径必须用双引号包裹,且确保目录真实存在、有读取权限
必须禁用默认虚拟主机,否则泛解析失效
Apache 总会匹配一个 <VirtualHost> 块。如果你没显式定义一个兜底的 _default_:80 或明确的 ServerName localhost 块,所有未被 VirtualDocumentRoot 覆盖的请求(比如直接访问 127.0.0.1 或 localhost)会落到 XAMPP 自带的默认站点(即 htdocs 根目录),造成泛解析“部分生效”的假象。
解决办法是在 httpd-vhosts.conf 最顶部插入:
<VirtualHost _default_:80>
DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">
Require all granted
AllowOverride All
</Directory>
</VirtualHost>
然后在下方单独写泛解析块:
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
UseCanonicalName Off
VirtualDocumentRoot "C:/xampp/htdocs/users/%1"
</VirtualHost>
注意:ServerAlias *.example.com 是必需的,否则 Apache 不会把请求交给这个块处理;UseCanonicalName Off 确保 Host 头原样传递给 VirtualDocumentRoot 解析。
Windows hosts 文件无法通配,必须逐条映射测试域名
浏览器发起请求前,先查系统 hosts 文件。而 Windows 的 hosts **完全不支持通配符**,写 127.0.0.1 *.example.com 是无效的,会被整个忽略。
本地开发时,只能手动添加常用测试域名:
127.0.0.1 example.com127.0.0.1 user1.example.com127.0.0.1 blog.example.com
每加一行就保存一次,无需重启系统,但建议执行 ipconfig /flushdns 清空 DNS 缓存,并在浏览器访问前用 ping user1.example.com 验证是否返回 127.0.0.1。Chrome/Firefox 若仍跳转到 XAMPP 默认页,大概率是 hosts 没生效或 Apache 没加载泛解析块——优先检查 httpd -t 语法验证结果。
真正上线时,DNS 层面才需要配置泛解析(A 记录主机名为 *),本地 hosts 只负责开发阶段有限覆盖。

















