Windows下PHP 8.4 + Apache 2.4设虚拟目录本质是配置VirtualHost:需启用httpd-vhosts.conf及vhost_alias、rewrite等模块;DocumentRoot必须指向public/目录并配AllowOverride All和Require all granted;PHP须用TS版,确保php8apache2_4.dll存在且LoadModule路径正确;hosts文件须ANSI/UTF-8无BOM保存,每行单域名,配合ipconfig /flushdns验证。

PHP 8.4 + Apache 2.4 在 Windows 下设虚拟目录,本质是配虚拟主机(VirtualHost),不是传统意义的“子目录别名”。直接用 Alias 配 PHP 脚本会出错——因为 PHP 文件需要被解析器处理,而 Alias 不触发 AddHandler 或 ProxyPassMatch,导致下载源码或 500 错误。
确认 Apache 已加载 vhosts 模块并启用配置文件
Apache 2.4 默认不主动读取 httpd-vhosts.conf,必须手动启用。打开 httpd.conf,找到这行:
#Include conf/extra/httpd-vhosts.conf
删掉开头的 #,保存。再确认以下模块已启用(没注释):
LoadModule vhost_alias_module modules/mod_vhost_alias.so-
LoadModule rewrite_module modules/mod_rewrite.so(框架路由必需)
如果用 php-fpm(推荐),还需确保 proxy_fcgi_module 和 proxy_module 已加载;若用 mod_php,则需对应 php8apache2_4.dll 路径正确且 LoadModule 行未注释。
立即学习“PHP免费学习笔记(深入)”;
DocumentRoot 必须指向 public/ 目录(尤其 Laravel/ThinkPHP)
框架项目不能把 DocumentRoot 设为项目根目录,否则 .env、app/ 等敏感目录可能被直接访问,且 .htaccess 在非 public/ 下无效。错误示例:
DocumentRoot "C:/myapp"
正确写法(以 Laravel 为例):
PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
DocumentRoot "C:/myapp/public"
对应 <Directory> 块也必须同步路径,并显式授权:
-
AllowOverride All(让.htaccess生效) -
Require all granted(Apache 2.4 的新权限语法,Order/Allow已废弃) - 如果用 mod_php,加
AddHandler application/x-httpd-php .php到<VirtualHost>内
hosts 文件绑定 + 浏览器访问时的常见陷阱
Windows 下改 C:\Windows\System32\drivers\etc\hosts 是必须步骤,但容易踩三个坑:
- 文件无扩展名,用记事本保存时必须选“所有文件”,编码选 ANSI 或 UTF-8 无 BOM,否则 Apache 启动失败
- 每行只能有一个域名,不能写
127.0.0.1 site1.test site2.test—— 要拆成两行 - 浏览器缓存 DNS:改完 hosts 后,Chrome/Firefox 可能仍走旧缓存,执行
ipconfig /flushdns并硬刷新(Ctrl+Shift+R)
验证是否生效:命令行运行 ping site1.test,应返回 127.0.0.1;若返回超时或其它 IP,说明 hosts 未生效或有拼写错误(比如多空格、中文标点)。
PHP 8.4 的 mod_php 加载必须用线程安全版 dll
PHP 官网下载页明确要求:Apache 场景下必须用 Thread Safe (TS) 版本。非 TS 版本没有 php8apache2_4.dll,加载会报错:
Cannot load D:/php/php8apache2_4.dll into server: The specified module could not be found.
检查方法:
- 解压后的 PHP 目录里存在
php8apache2_4.dll(文件名中的数字与 PHP 版本严格对应,如 PHP 8.4.10 →php8apache2_4.dll) -
httpd.conf中LoadModule行路径准确,且PHPIniDir指向含php.ini的目录 -
php.ini中extension_dir是绝对路径,结尾不带斜杠,例如:extension_dir = "D:/php/ext"
最后用 httpd -t 检查语法,再 httpd -k restart 重启服务。test.php 里只放 <?php phpinfo(); ?>,访问成功才代表 PHP 解析链完整打通。


















