关键是要启用Apache的AcceptPathInfo On指令并确保php.ini中cgi.fix_pathinfo=1,同时正确加载PHP 8.4.1对应的php8apache2_4.dll模块,使PATH_INFO能被正确传递和解析。

要在 Windows 11 上让 Apache 2.4.69 正确支持 PHP 8.4.1 的 PATH_INFO(即类似 /index.php/abc/123 这种 URL 路径参数),关键不是安装 PHP,而是确保 Apache 正确将请求转发给 PHP,并且 PHP 自身不丢弃 PATH_INFO。默认情况下,Apache + mod_php 在某些配置下会清空或忽略 PATH_INFO,尤其在使用 AddHandler 或 SetHandler 时容易出问题。
确认 PHP 已启用并正确加载
先确保 PHP 8.4.1 已集成进 Apache,且 phpinfo() 页面中能看到 Server API 显示为 Apache 2.0 Handler(不是 CGI/FastCGI)。若显示为 FPM 或 CLI,则 PATH_INFO 行为不同,本教程不适用。
检查 httpd.conf 中是否已加载 PHP 模块(路径需与你实际解压位置一致):
-
LoadModule php_module "C:/php/php8apache2_4.dll"(注意:PHP 8.4.1 对应的 DLL 名为php8apache2_4.dll,非旧版php8apache2_4.dll或php7apache2_4.dll) AddHandler application/x-httpd-php .phpPHPIniDir "C:/php"
重启 Apache 后访问 http://localhost/info.php,搜索 PATH_INFO —— 若值为空或显示 no value,说明尚未生效,继续往下调。
立即学习“PHP免费学习笔记(深入)”;
启用 Apache 的 AcceptPathInfo 指令
这是最关键的一步。Apache 默认禁用对 PATH_INFO 的解析,必须显式开启。在 httpd.conf 或对应虚拟主机配置中,找到你的网站根目录配置段(<Directory ".../htdocs">),添加或修改以下行:
AcceptPathInfo On- 确保该指令未被
AllowOverride None阻止;如需通过 .htaccess 控制,可设为AllowOverride All(开发环境可用)
示例片段:
<Directory "C:/Apache24/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
AcceptPathInfo On
</Directory>
验证并修复 PHP 层 PATH_INFO 丢失问题
即使 Apache 传入了 PATH_INFO,PHP 8.4.1 在某些 FastCGI 兼容模式下仍可能将其覆盖为 $_SERVER['ORIG_PATH_INFO']。请在 php.ini 中检查以下设置:
- 确认
cgi.fix_pathinfo=1(默认值,不要改为 0;设为 0 会彻底禁用 PATH_INFO 解析) - 检查是否有框架或脚本手动重置
$_SERVER['PATH_INFO'](例如 Laravel 的 public/index.php 会做兼容处理) - 创建测试文件
test-path.php放入 htdocs:
<?php
var_dump([
'REQUEST_URI' => $_SERVER['REQUEST_URI'],
'SCRIPT_NAME' => $_SERVER['SCRIPT_NAME'],
'PATH_INFO' => $_SERVER['PATH_INFO'] ?? 'NOT SET',
'ORIG_PATH_INFO' => $_SERVER['ORIG_PATH_INFO'] ?? 'NOT SET',
]);
访问 http://localhost/test-path.php/hello/world,正常输出应类似:
array(4) {
["REQUEST_URI"]=> string(25) "/test-path.php/hello/world"
["SCRIPT_NAME"]=> string(14) "/test-path.php"
["PATH_INFO"]=> string(11) "/hello/world"
["ORIG_PATH_INFO"]=> string(11) "/hello/world"
}
常见失败原因与修复
-
URL 重写干扰:如果你启用了
mod_rewrite并写了规则(如伪静态),请确认没有用RewriteRule覆盖或丢弃 PATH_INFO。避免在规则中使用[PT]或[L]以外的标记干扰传递 - 多版本 PHP 冲突:确认系统 PATH 中无其他 PHP 版本干扰;Apache 加载的 DLL 必须与 PHP 8.4.1 完全匹配(VC17、x64、TS)
-
权限或 SELinux 类机制:Windows 11 无 SELinux,但需确保 Apache 服务以本地系统账户运行,且
php.ini文件可读 -
浏览器缓存或代理:首次测试建议用隐身窗口或
curl -v http://localhost/test-path.php/a/b直接验证响应头与正文



















