虚拟主机(virtualhost)在windows 7下apache+php环境中是必须手动配置的核心环节,否则无法实现多站点隔离、域名绑定及独立php.ini行为;需在httpd.conf中启用include conf/extra/httpd-vhosts.conf,并在中同时配置documentroot与授权,且本地域名须写入hosts文件并刷新dns缓存。

Windows 7 下用 Apache 搭建 PHP 环境时,虚拟主机(VirtualHost)不是可选项,而是必须手动配置的环节——否则所有站点只能共用 htdocs 目录,无法按项目隔离、无法绑定不同域名或端口、也无法启用独立的 php.ini 行为。
Apache 的 httpd-vhosts.conf 必须显式启用
默认 Apache 不加载虚拟主机配置。你得先在 httpd.conf 里取消注释这一行:
Include conf/extra/httpd-vhosts.conf
否则哪怕你在 conf/extra/httpd-vhosts.conf 里写满配置,Apache 也完全无视。常见错误现象是:重启 Apache 成功,但访问自定义域名(如 dev.local)直接跳转到默认 It works! 页面,或返回 403/404。
确认方式:启动 Apache 后执行 httpd -t,若提示 Syntax OK 但仍不生效,大概率就是这行没放开。
<virtualhost></virtualhost> 块里必须包含 DocumentRoot 和 Directory 权限声明
只写 DocumentRoot "D:/myproject" 不够,Apache 2.2+ 默认拒绝访问非 htdocs 下的路径。你必须同步添加对应的 <directory></directory> 块并显式授权:
<virtualhost>
ServerName dev.local
DocumentRoot "D:/myproject"
<directory>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</directory></virtualhost>
注意三点:
-
Require all granted是 Apache 2.4+ 的语法;若你用的是 Apache 2.2(如 httpd-2.2.x),得换成Order allow,deny+Allow from all -
AllowOverride All才能让项目里的.htaccess生效,否则伪静态(如 Laravel 的public/.htaccess)会直接 500 - 路径中的反斜杠
在 Windows 下必须统一为正斜杠/或双反斜杠\,否则 Apache 启动失败且报错信息极不明确
本地域名需手动写入 hosts 文件,且不能依赖 DNS
Windows 7 不会自动解析 dev.local 这类无 TLD 的域名。你必须编辑 C:WindowsSystem32driversetchosts(需管理员权限保存),追加一行:
127.0.0.1 dev.local
常见疏漏点:
- 用记事本打开
hosts时,务必选择“以管理员身份运行”,否则保存失败且无提示 - 不要写成
localhost dev.local——localhost是保留名,不能复用作别名 - 改完 hosts 后,Chrome / Firefox 会缓存 DNS,需执行
ipconfig /flushdns并彻底关闭浏览器进程(任务管理器里杀掉所有 chrome.exe) - 避免使用
.dev—— Chrome 自 63 版起强制 HSTS 重定向到 HTTPS,导致本地 HTTP 站点打不开;推荐用.test或.local
PHP 解析只对当前 VirtualHost 生效,AddType 不能写在全局
如果你把 AddType application/x-httpd-php .php 写在 httpd.conf 全局区,它会对所有 VirtualHost 生效;但更稳妥的做法是把它放进每个 <virtualhost></virtualhost> 块内部(Apache 2.4+ 支持):
<virtualhost>
ServerName dev.local
DocumentRoot "D:/myproject"
AddType application/x-httpd-php .php
<directory>
...
</directory></virtualhost>
这样做的好处是:不同站点可指定不同 PHP 版本(配合 PHPIniDir),或禁用某些扩展(通过单独的 php.ini 路径)。但注意:PHPIniDir 指令不能出现在 <virtualhost></virtualhost> 块内(Apache 会报错),只能放在全局或 <directory></directory> 里用 php_admin_value 控制。
最易被忽略的细节:Apache 配置修改后,必须执行 httpd -k restart(而非仅刷新页面),且要检查 Windows 服务里 Apache 是否真的重启成功——有时界面显示“已启动”,实际进程卡死,netstat -ano | findstr :80 才能确认端口是否真被新进程占用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











