一句话说清虚拟主机配置的底层逻辑
在XAMPP中配置虚拟主机的核心思路,就是通过修改httpd-vhosts.conf文件并配合系统hosts文件,让Apache能根据域名或端口将请求分发到不同站点目录,从而在一台本地电脑上同时运行多个独立项目。
很多初学者卡在“改了配置没反应”或“所有域名都跳到同一个页面”这两个问题上,这篇文章会带你把每一步操作、每一个可能的坑都填平。
虚拟主机配置难点在哪
为什么你改了httpd.conf还是白屏
不少朋友在XAMPP安装目录下的apache/conf/httpd.conf里找了半天,根本看不到<VirtualHost>配置块,或者看到了一堆被注释掉的示例,这属于正常现象,因为XAMPP官方将虚拟主机的配置单独拆到了apache/conf/extra/httpd-vhosts.conf文件里,主配置文件只是在末尾附近通过Include指令将其引入。
如果你直接在主配置文件里硬写<VirtualHost>块,有时候会因为加载顺序问题导致配置被覆盖或忽略,行业共识认为,保持模块化配置是WAMP集成环境管理多站点最稳妥的方式。
本地多站点如何规划目录结构
在动手前,建议先规划好项目目录,比如你在开发时经常要同时调试企业官网和个人博客两个项目,目录结构建议按下面这样组织:
C:\xampp\htdocs\company企业官网项目文件C:\xampp\htdocs\blog个人博客项目文件
目录名称尽量用英文且不要包含空格,中文项目名虽然Apache新版支持不错,但为了兼容某些框架的URL路由规则,还是以英文字母作为目录名最省心。
虚拟主机配置分步实操
如何编辑httpd-vhosts.conf文件
用VS Code或Sublime打开以下路径的文件(注意是extra目录下的,不是根目录那个):
C:\xampp\apache\conf\extra\httpd-vhosts.conf
打开后会看到文件底部自带两个示例配置块,直接用注释符号将其整段隐藏,然后粘贴以下内容:
<VirtualHost :80>
ServerName localhost
DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost :80>
ServerName www.company.test
DocumentRoot "C:/xampp/htdocs/company"
<Directory "C:/xampp/htdocs/company">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
第一个VirtualHost

保留localhost的默认行为,防止你访问本机IP时出现403或目录列表失效,第二个块就是企业官网的虚拟主机配置。
为什么Windows系统的hosts文件如此重要
Apache不认识www.company.test这个域名,它只负责接收请求,真正将域名指向本机的任务由hosts文件完成。
按Win + R输入drivers路径,或直接在资源管理器地址栏黏贴以下内容:
C:\Windows\System32\drivers\etc
用管理员权限打开hosts文件(右键记事本或VS Code以管理员身份运行),在最后一行追加:
0.0.1 www.company.test
这里的0.0.1代表本机地址,保存时如果提示无权限,需要先将hosts文件复制到桌面修改,再覆盖回原目录,或者用管理员身份重新打开编辑器。
重启Apache让配置生效
修改完以上两个文件后,打开XAMPP控制面板,在Apache行点击Stop,等状态变为红色叉叉后再点Start,有些配置必须完全停止才能重新加载,Restart按钮在某些版本中容易残留旧进程导致端口占用。
然后打开浏览器,访问http://www.company.test,如果能看到企业官网的内容,说明配置成功。
配置虚拟主机时遇到的常见错误
域名打在地址栏却跳到默认站点
这个现象几乎所有人都遇过,原因通常有两个:
httpd-vhosts.conf中第一个VirtualHost不是localhostApache会把不匹配任何ServerName的请求指向第一个定义的站点,如果你的第一个站点写的是某个具体项目,那么访问http://localhost或者本机IP都会跳到那个项目里。hosts文件里的域名和ServerName拼写不一致 比如hosts里写了www.company.test,配置文件的ServerName却漏了www,稍微一个字母不匹配就会落到默认站点。
为什么访问显示403 Forbidden
绝大多数情况是<Directory>的路径写错或权限指令缺失,确认你的DocumentRoot标签和<Directory>标签指向的是同一个绝对路径,且路径使用正斜杠()而非反斜杠(\),如果项目目录位于htdocs之外,比如放到D:\projects\company,还需要在<Directory>块中显式加一行Require all granted,否则Apache出于安全考虑默认拒绝外部路径访问。
配置了多个域名但只有第一个能访问
检查每个<VirtualHost>块之间是否缺少空行或右括号

>,手写粘贴配置时,漏掉</VirtualHost>结束标签是最常见的低级错误,每一组配置块的结束标签必须完整,且ServerName不能重复。
虚拟主机配置完成后的验证与优化
如何确认多站点确实在独立运行
在company目录的index.php里写入一行不同的内容,比如echo '这是企业官网';,在blog目录里写入echo '这是个人博客';,然后分别访问:
http://www.company.testhttp://www.blog.test
如果显示各自独立的内容,说明虚拟主机配置生效。
端口访问和域名访问可以共存
在实际开发场景中,有时虚拟主机配置完成后,想直接用http://localhost:8080访问某个测试页面,同时又保留域名访问方式,这需要额外监听一个端口,在上一篇文章的基础上修改ServerName为localhost并追加Port为8080:
Listen 8080
<VirtualHost :8080>
ServerName localhost
DocumentRoot "C:/xampp/htdocs/testpage"
</VirtualHost>
这种情况下,你访问http://localhost:8080时会在哪个服务器上解析?Apache会依据请求头中的Host字段来匹配ServerName,在没有域名只有IP时,它同样会尝试匹配localhost对应的站点,只要hosts文件没有把某个域名绑定到非本机IP,一切都在本地完成。
Apache虚拟主机配置的完整检查清单
配置完成后,建议逐一核对下面这份清单:
- 配置文件
httpd-vhosts.conf末尾是否有干净的<VirtualHost>块 - 每个项目的
DocumentRoot和<Directory>路径是否一致 - 是否关闭了XAMPP默认的演示页面占用的80端口
hosts文件是否有多余的IPv6映射干扰(部分系统会默认解析:1)- 是否用管理员身份保存过所有修改文件
虚拟主机配置经验谈
修改hosts文件影响系统全局网络吗
做开发的人都知道,在Linux下配置虚拟主机和在Windows下差不多,但Windows下改动hosts文件不需要重启网络服务,浏览器强制刷新一次即可,不过如果你的浏览器开了代理插件或安全软件的内核防护,某些工具会绕过系统DNS解析,导致你配置好的域名在浏览器里无法访问,但在命令行ping www.company.test却能解析到0.0.1。
这种情况下,关闭代理软件的“系统代理”开关,或者将www.company.test加入代理软件的直连白名单即可。
网站开发完成后怎么让手机访问本地站点

若需要在同一局域网内用手机预览虚拟主机配置的站点,操作略有不同,先将你的电脑IP作为ServerName的替代,或者在hosts文件里再增加一条IP映射,手机端无法直接读取Windows的hosts文件,需要你让手机连接同一WiFi,然后在手机浏览器里输入电脑的局域网IP加端口(如果配置了非80端口)来访问。
虚拟主机配置和其他方案的对比
| 对比维度 | XAMPP虚拟主机配置 | 单一站点直接改httpd.conf |
端口号区分多站点 |
|---|---|---|---|
| 多项目同时开发 | ✅ 支持不同域名 | ❌ 只支持一个站点 | ✅ 支持 |
| 路径的可读性 | ✅ 域名指向目录 | ❌ 依赖目录名 | ✅ 依赖端口 |
| 浏览器配置Cookie隔离 | ✅ 不同域名互不干扰 | ❌ 共享Cookie | ❌ 相同域名会串 |
| 适合的场景 | 多项目并行开发、前后端联调 | 快速启动单个小项目 | API服务或临时测试 |
虚拟主机配置相关高频疑问
为什么我配置的虚拟主机访问时一直提示“您无权查看此网页”
把<Directory>块中的AllowOverride None改为AllowOverride All,同时检查目录路径中是否存在中文名,Apache对包含中文的路径有时会返回401或403,若你的项目用到了.htaccess伪静态规则,AllowOverride All是必须的。
我已经按照步骤配置了,但Apache重启按钮是灰色
XAMPP控制面板中重启按钮灰色,通常意味着Apache服务并未以服务模式运行,而是以进程模式挂在后台,此时打开任务管理器,搜索httpd.exe进程,全部结束掉,再重新从XAMPP面板启动,如果还不行,就检查端口80是否被其他软件占用,常见占用程序有迅雷、IIS或某些网银控件。
XAMPP在Mac系统下配置虚拟主机有什么不同
Mac版XAMPP的httpd-vhosts.conf路径不变,但hosts文件路径变为/etc/hosts,编辑时需使用sudo权限,另外Mac自带Apache可能与XAMPP冲突,需要先在系统偏好设置里关闭系统自带的Web共享服务,否则80端口会被抢占,整体配置语法完全一致,只是一些绝对路径的前缀相异。
配置虚拟主机这件事,本质上就是让Apache按需分发域名,让Windows系统把域名翻译成本机地址,两个环节打通,多站点开发就不再受目录切换的折腾,不要试图一次记忆所有参数,把配置文件备份一份放在项目目录里,以后新开项目时复制改一下ServerName和DocumentRoot,三分钟就能上线一个新站点。
