php本地绑定多域名需三步:一、修改hosts文件映射域名到127.0.0.1;二、apache中配置多个virtualhost,均指向同一documentroot;三、php中用strtolower($_server['http_host'])严格校验域名,同时启用mod_rewrite并设allowoverride all。

phpEnv 本身不处理域名绑定,它只是 Windows 下封装 Apache + PHP + MySQL 的本地环境套件。多域名访问同一项目,必须靠 hosts 文件映射 + Apache 虚拟主机配置配合,缺一不可。
hosts 文件必须先配好
这是整个流程的起点,没这步,浏览器根本不会把域名发给你的本地 Apache。
- 路径:Windows 是
C:\Windows\System32\drivers\etc\hosts,需用管理员权限打开记事本编辑 - 每行写一个映射,格式严格为
127.0.0.1 域名,不能带http://、端口或 tab - 示例:
127.0.0.1 local.test 127.0.0.1 api.local.test 127.0.0.1 admin.local.test
- 改完必须刷新 DNS 缓存:
ipconfig /flushdns,否则旧缓存会继续指向错误地址
Apache 虚拟主机要共用同一个 DocumentRoot
多个域名想访问同一套代码,关键不是让每个 <virtualhost></virtualhost> 指向不同目录,而是让它们都指向同一个物理路径,比如 D:/phpEnv/www。
- 确认
httpd.conf中已启用虚拟主机:取消注释Include conf/extra/httpd-vhosts.conf - 在
conf/extra/httpd-vhosts.conf中添加多个<virtualhost></virtualhost>,但DocumentRoot全部一致 - 每个块内只改
ServerName,别动DocumentRoot和<directory></directory>路径 - 示例:
<virtualhost> ServerName local.test DocumentRoot "D:/phpEnv/www" <directory> AllowOverride All Require all granted </directory></virtualhost><virtualhost> ServerName api.local.test DocumentRoot "D:/phpEnv/www" <directory> AllowOverride All Require all granted </directory></virtualhost> - 改完重启 Apache(用 phpEnv 控制面板或托盘图标),否则配置不生效
PHP 层判断域名要防空值和大小写
如果项目需要根据域名加载不同逻辑(比如不同首页、不同配置),得在 PHP 里读 $_SERVER['HTTP_HOST'],但这个变量不可信,必须校验。
-
$_SERVER['HTTP_HOST']可能为空(如 curl 直连、某些代理),用前必须isset()判断 - 不要用
strpos()粗暴匹配,strstr($_SERVER['HTTP_HOST'], 'local.test')会被evil.local.test绕过 - 推荐用严格相等:
if ($_SERVER['HTTP_HOST'] === 'local.test') - 注意大小写:HTTP_HOST 是小写的,但用户可能输大写域名,建议统一转小写再比:
strtolower($_SERVER['HTTP_HOST']) === 'local.test' - 如果用了 URL 重写(如 ThinkPHP 的 pathinfo),确保
$_SERVER['HTTP_HOST']在重写前就读取,否则可能被覆盖
最容易被忽略的是:phpEnv 默认禁用 mod_rewrite 且 AllowOverride None,导致 .htaccess 不生效。若项目依赖重写规则(如 Laravel、ThinkPHP),必须手动开启 rewrite 模块并把对应 <directory></directory> 的 AllowOverride 改成 All,否则哪怕域名通了,路由也 404。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











