phpenv配置二级域名本质是修改apache的httpd-vhosts.conf,需同步更新hosts文件、正确设置servername/documentroot/directory权限,并避免默认virtualhost冲突。

phpEnv里配二级域名,本质是改Apache虚拟主机
phpEnv本身不提供图形化二级域名配置界面,它只是把Apache、PHP、MySQL打包封装。所有域名绑定逻辑都落在Apache的httpd-vhosts.conf上。你看到的“添加站点”操作,最终就是往这个文件里追加一个<virtualhost></virtualhost>块。
常见错误现象:填了bbs.test.local却打不开,浏览器报ERR_NAME_NOT_RESOLVED——这根本不是Apache问题,是hosts没同步改;或者能解析但返回403 Forbidden——大概率是<directory></directory>权限没放开。
- 确认
httpd.conf中已启用虚拟主机:检查是否有未注释的Include conf/extra/httpd-vhosts.conf - 确保
httpd-vhosts.conf末尾新增的<virtualhost></virtualhost>块里包含完整三项:ServerName bbs.test.local、DocumentRoot "E:/workspace/bbs"、<directory>... Require all granted </directory> - Windows下必须手动编辑
C:WindowsSystem32driversetchosts,追加一行:127.0.0.1 bbs.test.local - 改完后要重启phpEnv里的Apache服务(点红色“Restart”按钮),不能只刷新浏览器
通配符二级域名(*.test.local)在phpEnv里不可原生支持
phpEnv底层用的是标准Apache,而Apache默认不支持ServerName *.test.local这种写法——它只认确切域名。所谓“泛解析”,实际要靠两层配合:DNS层做*.test.local → 127.0.0.1,Apache层用ServerAlias或mod_rewrite兜底匹配。
但Windows的hosts文件不支持通配符,所以你在本地开发时,无法真正实现anyname.test.local自动指向项目目录。你只能逐个添加:
127.0.0.1 api.test.local127.0.0.1 admin.test.local127.0.0.1 demo.test.local
然后在httpd-vhosts.conf里为每个域名单独写一个<virtualhost></virtualhost>,或用ServerAlias合并(仅限同目录):ServerName test.local + ServerAlias *.test.local无效,但ServerAlias api.test.local admin.test.local是合法的。
phpEnv中DocumentRoot路径容易写错
很多人把DocumentRoot设成项目根目录(比如E:workspacemyapp),但Apache默认只把index.php当入口,不会自动路由到框架的public/子目录。结果访问时直接列目录,或报File not found。
正确做法是让DocumentRoot精确指向框架的web根(Laravel是public/,ThinkPHP是public/或public/index.php):
- Laravel项目:
DocumentRoot "E:/workspace/laravel/public" - 原生PHP项目:
DocumentRoot "E:/workspace/plain"(前提是index.php就在该目录下) - 如果误写成
DocumentRoot "E:/workspace/laravel",又没配DirectoryIndex index.php,就会返回403或目录列表
另外注意路径分隔符:Windows下用正斜杠/或双反斜杠\,别用单反斜杠(会被当成转义字符)。
为什么改了配置还是走默认站点?
Apache按httpd-vhosts.conf中<virtualhost></virtualhost>出现顺序匹配,一旦前面有个<virtualhost></virtualhost>没写ServerName,它就会变成“兜底默认站点”,吞掉所有未明确匹配的请求——包括你的二级域名。
检查点很具体:
- 打开
httpd-vhosts.conf,确认第一个<virtualhost></virtualhost>块有ServerName localhost,且DocumentRoot指向的是phpEnv默认的htdocs - 你的二级域名配置块必须放在这个默认块之后
- 所有
ServerName值必须和hosts里写的完全一致(区分大小写,不带http://) - Apache日志里搜
[core:warn],看有没有_default_ VirtualHost overlap on port 80警告——说明端口被重复监听,配置冲突
最隐蔽的问题:phpEnv界面里点“添加站点”后,它可能悄悄在httpd-vhosts.conf开头插入新块,把你手写的配置顶到了后面,导致失效。建议关闭phpEnv的站点管理功能,全程手写配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











