phpEnv本身不直接管理域名,需通过Web服务器(Apache/Nginx)配置+系统hosts文件配合实现多域名绑定,PHP层仅负责识别响应;必须修改hosts映射、配置VirtualHost或server_name、重启/重载服务并安全读取HTTP_HOST。

phpEnv 本身不直接管理域名,它只是 Windows 下的 PHP 环境集成包(类似 phpStudy),真正起作用的是它内置的 Apache 或 Nginx。多域名别名必须靠 Web 服务器配置 + 系统 hosts 文件配合,PHP 层只负责识别和响应。
修改 hosts 文件映射本地域名
这是最前置、最容易漏掉的一步。没有这步,浏览器根本不会把你的自定义域名发给本地服务器。
- 以管理员身份打开
C:\Windows\System32\drivers\etc\hosts - 在末尾追加(每行一个,用空格分隔,不要 tab):
127.0.0.1 site-a.test<br>127.0.0.1 www.site-a.test<br>127.0.0.1 api.site-a.test
- 保存后运行
ipconfig /flushdns刷新 DNS 缓存 - 验证是否生效:在命令行执行
ping site-a.test,应返回127.0.0.1
Apache 模式下配置 VirtualHost 别名
phpEnv 默认用 Apache,需手动编辑其 httpd-vhosts.conf(路径通常为 phpEnv\Apache\conf\extra\httpd-vhosts.conf)。
- 确保
httpd.conf中已启用:Include conf/extra/httpd-vhosts.conf且未被注释 - 每个站点用一个
<VirtualHost *:80>块,ServerName写主域名,ServerAlias写所有别名:<VirtualHost *:80><br> ServerName site-a.test<br> ServerAlias www.site-a.test api.site-a.test<br> DocumentRoot "D:/www/site-a"<br> <Directory "D:/www/site-a"><br> AllowOverride All<br> Require all granted<br> </Directory><br></VirtualHost>
-
ServerAlias支持通配符,如*.site-a.test,但需确认 Apache 已加载mod_vhost_alias - 改完必须重启 Apache:在 phpEnv 界面点「重启 Apache」或命令行执行
httpd -k restart
Nginx 模式下用 server_name 列出全部域名
若你切换 phpEnv 用了 Nginx,则修改 nginx.conf(通常在 phpEnv\Nginx\conf\nginx.conf)的 server 块。
立即学习“PHP免费学习笔记(深入)”;
- 在
server块内,把所有要绑定的域名写进server_name,空格分隔:server {<br> listen 80;<br> server_name site-a.test www.site-a.test api.site-a.test;<br> root "D:/www/site-a";<br> index index.php;<br> # ... 其他 location 配置<br>} - 注意:Nginx 不区分
ServerAlias,所有域名都平级写在server_name后即可 - 改完必须重载 Nginx:
nginx -s reload,仅「重启 phpEnv」可能不生效 - 如果启用了 HTTPS,每个域名都得出现在
server_name里,否则证书会报NET::ERR_CERT_COMMON_NAME_INVALID
PHP 代码中安全读取当前域名
Web 服务器把请求头传给 PHP 后,你得用对方式拿到它,否则会出错或被绕过。
- 永远用
$_SERVER['HTTP_HOST'],不是$_SERVER['SERVER_NAME'](后者来自配置,不可信) - 强制小写并白名单校验:
$host = strtolower($_SERVER['HTTP_HOST']);<br>$allowed = ['site-a.test', 'www.site-a.test', 'api.site-a.test'];<br>if (!in_array($host, $allowed)) {<br> http_response_code(400);<br> exit('Invalid host');<br>} - 别硬编码数据库名或上传路径——用
$host动态查配置数组,例如:$config[$host]['db_name'] - 静态资源路径(如
/assets/logo.png)要按$host生成完整 URL,避免因DocumentRoot不同导致 404
很多人卡在「改了 hosts 和配置,但浏览器还是 404」,大概率是没重载 Web 服务,或者 hosts 文件权限不足没保存成功。另外,Chrome 有时会缓存 301 重定向,换 Edge 或隐身窗口测试更可靠。



















