PHP本地多域名绑定需三步:修改hosts映射、配置Web服务器虚拟主机(Apache用<VirtualHost>,Nginx用server块)、PHP代码用$_SERVER['HTTP_HOST']识别域名;三者域名必须完全一致,否则导致502/404。

phpEnv 是 Windows 下轻量级 PHP 本地环境(类似 XAMPP、WAMP),但默认不带虚拟主机管理界面,多域名配置必须手动改 hosts + httpd-vhosts.conf,否则所有请求都会落到默认站点。
改 hosts 文件是第一步,且必须用管理员权限保存
Windows 的 hosts 文件路径是 C:\Windows\System32\drivers\etc\hosts。直接双击打开会提示“无权限”,必须右键用记事本“以管理员身份运行”,再通过“文件 → 打开”选中该文件。追加以下内容(每行一个,IP 和域名之间用空格,不能用 Tab):
127.0.0.1 site-a.test 127.0.0.1 api.site-a.test 127.0.0.1 admin.site-a.test
改完后执行 ipconfig /flushdns 刷新 DNS 缓存,否则浏览器仍可能走旧缓存。
在 httpd-vhosts.conf 里配 <VirtualHost>,别漏掉 Listen 80
phpEnv 的 Apache 配置通常位于 phpEnv\Apache\conf\extra\httpd-vhosts.conf。确保该文件被主配置加载(检查 phpEnv\Apache\conf\httpd.conf 中是否有 Include conf/extra/httpd-vhosts.conf 且未被注释)。每个域名需独立一个 <VirtualHost *:80> 块,例如:
立即学习“PHP免费学习笔记(深入)”;
<VirtualHost *:80>
ServerName site-a.test
DocumentRoot "D:/phpEnv/www/site-a/public"
<Directory "D:/phpEnv/www/site-a/public">
Require all granted
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName api.site-a.test
DocumentRoot "D:/phpEnv/www/site-a/api"
<Directory "D:/phpEnv/www/site-a/api">
Require all granted
AllowOverride All
</Directory>
</VirtualHost>
常见错误包括:
-
ServerName拼错或大小写不一致(Site-A.test≠site-a.test) - 没启用
Listen 80(检查httpd.conf开头是否含该行) -
DocumentRoot路径含中文或空格却没加英文双引号 - 改完没重启 Apache:用 phpEnv 控制面板点「重启 Apache」,或进
phpEnv\Apache\bin\执行httpd -k restart
PHP 层识别当前域名要用 $_SERVER['HTTP_HOST'],别碰 $_SERVER['SERVER_NAME']
如果你在代码里需要按域名切换配置(比如数据库、静态资源路径),必须用 $_SERVER['HTTP_HOST'],它反映浏览器实际发来的 Host 头;$_SERVER['SERVER_NAME'] 来自 Apache 的 ServerName 配置,对多域名场景完全不可靠。
安全做法是先清理端口再比对:
$host = $_SERVER['HTTP_HOST'] ?? '';
$host = strtolower(preg_replace('/:\d+$/', '', $host));
if ($host === 'site-a.test') {
$config = require 'config/site-a.php';
} elseif ($host === 'api.site-a.test') {
$config = require 'config/api.php';
}
注意:preg_replace('/:\d+$/', '', $host) 是为了去掉 localhost:8080 这类开发时带端口的情况,避免匹配失败。
一个站点绑多个域名?只需在同一个 <VirtualHost> 里加 ServerAlias
如果只是让 www.site-a.test 和 site-a.test 都指向同一套代码,不用建两个 <VirtualHost>,直接用 ServerAlias:
<VirtualHost *:80>
ServerName site-a.test
ServerAlias www.site-a.test *.site-a.test
DocumentRoot "D:/phpEnv/www/site-a/public"
<Directory ...>...</Directory>
</VirtualHost>
ServerAlias 支持通配符(如 *.site-a.test),但注意 Apache 版本要 ≥ 2.2.12;另外,所有别名也必须在 hosts 里单独映射,否则 DNS 解析不过去。
最容易被忽略的点是:phpEnv 默认关闭 mod_rewrite,而 ThinkPHP、Laravel 等框架的伪静态依赖它。确认 httpd.conf 中 LoadModule rewrite_module modules/mod_rewrite.so 未被注释,且 <Directory> 块里有 AllowOverride All,否则 .htaccess 不生效,路由全 404。



















