如何配置phpEnv使二级域名指向子目录,实现phpEnv虚拟主机的高级设置?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1071个文字,预计阅读时间需要5分钟。
phpEnv 的二级域名默认行为是什么
phpEnv 是基于 XAMPP / WAMP 简化封装的本地 PHP 环境,它默认只启用主域名(如 localhost)和端口映射,所有虚拟主机配置都依赖 Apache 的 httpd-vhosts.conf。它不会自动识别你放在 www/blog/ 下的文件并让 blog.localhost 自动指向那里 —— 这个“自动”根本不存在。
常见错误现象:blog.localhost 打开后显示 404,或直接跳转到主站首页;修改了 hosts 文件、加了 VirtualHost,但页面仍加载根目录的 index.php。
- phpEnv 默认未开启
mod_rewrite,.htaccess规则全部失效 - 即使开了
mod_rewrite,Apache 默认禁止.htaccess覆盖权限(AllowOverride None) - Windows 下 hosts 文件写错格式(比如多空格、没换行),导致 DNS 解析根本没生效
必须改的三个地方:hosts + httpd-vhosts.conf + .htaccess
缺一不可,顺序不能乱。先让系统认出域名,再让 Apache 接收请求,最后把请求导向子目录。
立即学习“PHP免费学习笔记(深入)”;
第一步:编辑 C:\Windows\System32\drivers\etc\hosts,追加一行:
127.0.0.1 blog.localhost
第二步:打开 phpEnv 安装目录下的 Apache\conf\extra\httpd-vhosts.conf,添加:
<VirtualHost *:80><br> ServerName blog.localhost<br> DocumentRoot "D:/phpEnv/www"<br> <Directory "D:/phpEnv/www"><br> Options Indexes FollowSymLinks<br> AllowOverride All<br> Require all granted<br> </Directory><br></VirtualHost>
注意:DocumentRoot 必须指向你的 phpEnv 根目录(不是子目录),否则重写规则无法生效。
第三步:在 D:/phpEnv/www 根目录新建或编辑 .htaccess,内容为:
RewriteEngine On<br>RewriteCond %{HTTP_HOST} ^blog\.localhost$ [NC]<br>RewriteCond %{REQUEST_URI} !^/blog/<br>RewriteRule ^(.*)$ /blog/$1 [L]
这个规则的意思是:只要 Host 是 blog.localhost,且请求路径不以 /blog/ 开头,就自动补上前缀。这样 blog.localhost/test.php 就会真实访问 www/blog/test.php。
为什么不用直接配 VirtualHost 指向子目录
你可以配 DocumentRoot "D:/phpEnv/www/blog",但这会导致两个问题:
- PHP 的
__DIR__和相对路径全乱 —— 比如include '../config.php'会失败 - 所有静态资源(CSS/JS/图片)路径需全部重写,否则 404;而用
.htaccess重写 URL 路径,物理结构不变,兼容性更好 - 多个二级域名(如
api.localhost、admin.localhost)共存时,每个都单独配VirtualHost很容易冲突,统一走根目录 + 重写更可控
性能影响几乎为零,Apache 的 RewriteRule 在请求解析早期就完成,不增加额外文件读取。
常见失败原因排查点
如果按上面做了还是 500 或 403,请逐项检查:
- Apache 错误日志在
phpEnv\Apache\logs\error.log,搜Invalid command 'RewriteEngine'→ 说明mod_rewrite没启用,打开httpd.conf取消这行注释:LoadModule rewrite_module modules/mod_rewrite.so - 访问时提示
Forbidden→httpd-vhosts.conf里<Directory>块中漏了Require all granted(Apache 2.4+ 必须) -
.htaccess不生效 → 确认AllowOverride All已设,且文件名是纯.htaccess(Windows 资源管理器可能隐藏扩展名,实际成了.htaccess.txt) - 子目录里有
index.php但空白页 → 检查该文件内是否用了$_SERVER['DOCUMENT_ROOT']硬编码路径,应改用__DIR__或相对引入
最易被忽略的是:phpEnv 启动后,必须完全重启 Apache(不只是“重载配置”),否则新 VirtualHost 和模块加载不会生效。
本文共计1071个文字,预计阅读时间需要5分钟。
phpEnv 的二级域名默认行为是什么
phpEnv 是基于 XAMPP / WAMP 简化封装的本地 PHP 环境,它默认只启用主域名(如 localhost)和端口映射,所有虚拟主机配置都依赖 Apache 的 httpd-vhosts.conf。它不会自动识别你放在 www/blog/ 下的文件并让 blog.localhost 自动指向那里 —— 这个“自动”根本不存在。
常见错误现象:blog.localhost 打开后显示 404,或直接跳转到主站首页;修改了 hosts 文件、加了 VirtualHost,但页面仍加载根目录的 index.php。
- phpEnv 默认未开启
mod_rewrite,.htaccess规则全部失效 - 即使开了
mod_rewrite,Apache 默认禁止.htaccess覆盖权限(AllowOverride None) - Windows 下 hosts 文件写错格式(比如多空格、没换行),导致 DNS 解析根本没生效
必须改的三个地方:hosts + httpd-vhosts.conf + .htaccess
缺一不可,顺序不能乱。先让系统认出域名,再让 Apache 接收请求,最后把请求导向子目录。
立即学习“PHP免费学习笔记(深入)”;
第一步:编辑 C:\Windows\System32\drivers\etc\hosts,追加一行:
127.0.0.1 blog.localhost
第二步:打开 phpEnv 安装目录下的 Apache\conf\extra\httpd-vhosts.conf,添加:
<VirtualHost *:80><br> ServerName blog.localhost<br> DocumentRoot "D:/phpEnv/www"<br> <Directory "D:/phpEnv/www"><br> Options Indexes FollowSymLinks<br> AllowOverride All<br> Require all granted<br> </Directory><br></VirtualHost>
注意:DocumentRoot 必须指向你的 phpEnv 根目录(不是子目录),否则重写规则无法生效。
第三步:在 D:/phpEnv/www 根目录新建或编辑 .htaccess,内容为:
RewriteEngine On<br>RewriteCond %{HTTP_HOST} ^blog\.localhost$ [NC]<br>RewriteCond %{REQUEST_URI} !^/blog/<br>RewriteRule ^(.*)$ /blog/$1 [L]
这个规则的意思是:只要 Host 是 blog.localhost,且请求路径不以 /blog/ 开头,就自动补上前缀。这样 blog.localhost/test.php 就会真实访问 www/blog/test.php。
为什么不用直接配 VirtualHost 指向子目录
你可以配 DocumentRoot "D:/phpEnv/www/blog",但这会导致两个问题:
- PHP 的
__DIR__和相对路径全乱 —— 比如include '../config.php'会失败 - 所有静态资源(CSS/JS/图片)路径需全部重写,否则 404;而用
.htaccess重写 URL 路径,物理结构不变,兼容性更好 - 多个二级域名(如
api.localhost、admin.localhost)共存时,每个都单独配VirtualHost很容易冲突,统一走根目录 + 重写更可控
性能影响几乎为零,Apache 的 RewriteRule 在请求解析早期就完成,不增加额外文件读取。
常见失败原因排查点
如果按上面做了还是 500 或 403,请逐项检查:
- Apache 错误日志在
phpEnv\Apache\logs\error.log,搜Invalid command 'RewriteEngine'→ 说明mod_rewrite没启用,打开httpd.conf取消这行注释:LoadModule rewrite_module modules/mod_rewrite.so - 访问时提示
Forbidden→httpd-vhosts.conf里<Directory>块中漏了Require all granted(Apache 2.4+ 必须) -
.htaccess不生效 → 确认AllowOverride All已设,且文件名是纯.htaccess(Windows 资源管理器可能隐藏扩展名,实际成了.htaccess.txt) - 子目录里有
index.php但空白页 → 检查该文件内是否用了$_SERVER['DOCUMENT_ROOT']硬编码路径,应改用__DIR__或相对引入
最易被忽略的是:phpEnv 启动后,必须完全重启 Apache(不只是“重载配置”),否则新 VirtualHost 和模块加载不会生效。

