phpEnv不支持泛域名自动解析,需手动配置hosts文件和Web服务器规则;Windows hosts不支持通配符,必须结合Apache的ServerAlias与SetEnvIf或Nginx的正则server_name实现子域捕获,并通过PHP读取SUBDOMAIN变量。

phpEnv 不支持泛域名自动解析,必须手动配置 hosts + Nginx/Apache 规则
phpEnv 本身没有内置的泛域名(如 *.test)自动映射功能。它只是一个 Windows 图形化集成环境管理器,底层仍依赖 Apache 或 Nginx 的虚拟主机配置和系统 hosts 文件。所谓“通配符站点”,实际是靠你手动写规则模拟出来的效果。
为什么不能只改 hosts 实现泛域名?
Windows 的 hosts 文件不支持通配符语法(比如 *.dev 127.0.0.1 是无效的)。你只能逐条添加:
127.0.0.1 a.test127.0.0.1 b.test127.0.0.1 demo.test
但这样无法应对动态子域(如用户注册生成 user123.site.test),必须配合 Web 服务器做泛解析路由。
Apache 下如何配置泛域名虚拟主机(phpEnv 默认用 Apache)
进入 phpEnv 安装目录 → Apache\conf\extra\httpd-vhosts.conf,追加如下配置:
立即学习“PHP免费学习笔记(深入)”;
<VirtualHost *:80>
ServerName test
ServerAlias *.test
DocumentRoot "D:/phpenv/www"
<Directory "D:/phpenv/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
SetEnvIf Host "^(.*)\.test$" SUBDOMAIN=$1
</VirtualHost>
关键点:
-
ServerAlias *.test让 Apache 接收所有.test子域请求 -
SetEnvIf Host "^(.*)\.test$" SUBDOMAIN=$1把子域名提取为环境变量SUBDOMAIN,PHP 中可用$_SERVER['SUBDOMAIN']读取 -
DocumentRoot指向统一入口,后续由 PHP 路由分发(例如 ThinkPHP 的index.php入口统一处理)
改完后需在 phpEnv 界面点击「重启 Apache」,否则不生效。
Nginx 下泛域名配置(若你切换了 Web 服务)
phpEnv 切换到 Nginx 后,编辑 Nginx\conf\vhost\default.conf,添加:
server {
listen 80;
server_name ~^(?<subdomain>.+)\.test$;
root "D:/phpenv/www";
index index.php;
location / {
try_files $uri $uri/ /index.php?s=$uri&subdomain=$subdomain;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SUBDOMAIN $subdomain;
}
}
注意:
-
server_name ~^(?<subdomain>.+)\.test$</subdomain>是正则匹配,捕获子域名到变量$subdomain -
fastcgi_param SUBDOMAIN $subdomain把值透传给 PHP,可在$_SERVER['SUBDOMAIN']中拿到 - 路径中不要硬写
/tmp/php-cgi-*.sock—— phpEnv 的 Nginx 默认走 TCP 9000,不是 Unix socket
这类配置绕过了 phpEnv 的图形界面管理,一旦升级 phpEnv 可能被覆盖,建议备份该文件。
真正麻烦的不是配置本身,而是每次新增子域名都要手动加 hosts 条目——开发阶段可以接受,但上线前必须换成 DNS 泛解析或反向代理层处理。别指望 phpEnv 自动帮你干这个。



















