phpEnv默认不支持二级域名自动识别,需手动配置hosts映射、Apache虚拟主机及PHP环境变量注入,并设置session.cookie_domain=".example.com"实现跨子域会话共享。

phpEnv 是 Windows 下的轻量级 PHP 集成环境(类似 XAMPP),但**它默认不支持二级域名的自动识别与路由分发**,所有子域名请求都会被导向主站根目录,必须手动干预 DNS、Web 服务和 PHP 层三处才能生效。
phpEnv 的 hosts 文件必须手动添加二级域名映射
phpEnv 自带 Apache,但不会自动解析 blog.example.com 这类域名。Windows 不会凭空知道这个域名指向本机,必须显式告诉系统:
- 用记事本以管理员身份打开
C:\Windows\System32\drivers\etc\hosts - 在末尾追加一行:
127.0.0.1 blog.example.com(每新增一个二级域名都要加一行) - 保存后无需重启 phpEnv,但浏览器 DNS 缓存可能残留,建议执行
ipconfig /flushdns
注意:这里不能用通配符(如 127.0.0.1 *.example.com),Windows hosts 不支持正则,每个子域名都得单独列。
Apache 虚拟主机配置需显式声明 servername
phpEnv 的 Apache 默认只监听 localhost,不响应其他 Host 头。你得手动启用虚拟主机并定义规则:
立即学习“PHP免费学习笔记(深入)”;
- 进入 phpEnv 安装目录 →
Apache\conf\extra\httpd-vhosts.conf - 取消注释
Include conf/extra/httpd-vhosts.conf这行(在httpd.conf中) - 在
httpd-vhosts.conf底部添加完整块:
<VirtualHost *:80>
ServerName blog.example.com
DocumentRoot "D:/phpEnv/www/blog"
<Directory "D:/phpEnv/www/blog">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
关键点:ServerName 必须和 hosts 里写的完全一致(不含端口);DocumentRoot 路径要用正斜杠或双反斜杠;路径不存在会导致 403 错误。
PHP 层无法依赖 $_SERVER['HTTP_HOST'] 做动态路由
phpEnv 的 Apache 默认不把原始 Host 头传给 PHP,$_SERVER['HTTP_HOST'] 可能为空或固定为 localhost。必须显式注入:
- 在对应虚拟主机块内(即
<virtualhost></virtualhost>内),添加这一行: SetEnvIfNoCase Host "(.+)" HTTP_HOST=$1- 或者更稳妥地,在
httpd-vhosts.conf的<directory></directory>块里加:php_admin_value auto_prepend_file "D:/phpEnv/www/router.php"
然后在 router.php 里写:
<?php
if (isset($_SERVER['HTTP_HOST'])) {
$host = $_SERVER['HTTP_HOST'];
if (strpos($host, 'blog.example.com') === 0) {
define('SITE_ENV', 'blog');
}
}
这样后续逻辑才能靠 SITE_ENV 区分环境,而不是赌 $_SERVER['HTTP_HOST'] 可靠。
phpEnv 下 session 跨子域名共享要改 php.ini
用户从 example.com 登录后跳转到 admin.example.com 会丢失登录态,因为 cookie domain 默认是精确匹配的:
- 打开 phpEnv 控制面板 → “PHP设置” → 找到
php.ini文件路径(通常是PHP\php-version\php.ini) - 搜索
session.cookie_domain,取消注释并设为:session.cookie_domain = ".example.com"(注意开头的点) - 同时确保
session.cookie_httponly = On和session.cookie_secure = Off(本地开发不用 HTTPS 时设为 Off) - 改完必须点击 phpEnv 面板上的“重载 PHP 配置”,不能只重启 Apache
漏掉那个点(写成 example.com 而非 .example.com)是最常见的失败原因——它只会匹配主域名,不会下发到任何子域名。
phpEnv 没有 Nginx 模块、没有泛域名自动路由、不内置 DNS 服务,所有二级域名都是“手工焊”出来的。真正麻烦的不是写几行 PHP,而是每加一个子域名,就要同步改 hosts、加 VirtualHost、调权限、清缓存、验 cookie domain——少一步,整个链路就断在某一层。



















