根本原因是apache未透传path_info环境变量,需在httpd.conf中启用acceptpathinfo on和mod_rewrite,并将allowoverride设为all;yii配置中enableprettyurl=>true且showscriptname=>true;验证须用var_dump($_server['path_info'])确认。

Yii 框架在 XAMPP 上默认无法用 PATHINFO 模式(如 /index.php/site/about),根本原因是 Apache 未透传 PATH_INFO 环境变量,不是 Yii 配置或代码问题。
Apache 必须开启 AcceptPathInfo 并启用 mod_rewrite
Yii 依赖 $_SERVER['PATH_INFO'] 解析路由,而 XAMPP 自带的 Apache 默认禁用该功能。仅改 php.ini 中的 cgi.fix_pathinfo 不起作用。
-
cgi.fix_pathinfo = 1在 PHP 层只是允许解析路径,但 Apache 若不把路径段传进来,PHP 根本收不到 - 必须在
httpd.conf或虚拟主机配置中显式启用:AcceptPathInfo On - 同时确保
mod_rewrite已加载(取消#LoadModule rewrite_module modules/mod_rewrite.so前的注释) - 若使用
.htaccess(如 Yii 的web/目录下有重写规则),还需将对应<directory></directory>块中的AllowOverride None改为AllowOverride All
验证 PATH_INFO 是否真正生效
别靠 Yii 日志或页面表现判断,直接看 PHP 原始环境变量。在项目根目录放一个 test.php:
echo '<pre class="brush:php;toolbar:false;">'; var_dump($_SERVER['PATH_INFO'], $_SERVER['REQUEST_URI']);
访问 http://localhost/test.php/a/b/c,输出应类似:
string(7) "/a/b/c" string(15) "/test.php/a/b/c"
如果 PATH_INFO 是 null 或空字符串,说明 Apache 配置没生效;如果只有 REQUEST_URI 有值,就是透传失败。
Yii 配置需匹配 Apache 行为
Yii 的 URL 管理器不会自动适配服务器能力,必须手动对齐:
- 确保
config/web.php中启用 PATHINFO:'enablePrettyUrl' => true,和'showScriptName' => true,(注意:不是false,因为 XAMPP 下入口文件index.php必须显式存在才能触发 PATHINFO) -
'suffix' => '.html'这类后缀可选,但不要设成空字符串,否则 Yii 可能跳过 PATHINFO 解析分支 - Windows 下特别注意:分隔符必须是正斜杠
/,URL_PATHINFO_DEPR不是 Yii 配置项,那是 ThinkPHP 的——Yii 用的是urlManager的ruleConfig或默认行为,无需额外设分隔符
常见失败组合与绕过方式
即使 Apache 配置正确,XAMPP + Yii 仍可能因以下组合卡住:
- XAMPP 8.2+(PHP 8.2)搭配旧版 Yii 2.0.43 以下:PHP 8.2 移除了
create_function(),部分路由扩展会 fatal error,升级 Yii 到 2.0.45+ 或切换到 Yii 3 - 本地 hosts 绑定非
localhost(如dev.local),但httpd-vhosts.conf中未同步配置AcceptPathInfo On,导致子域名下失效 - 实在调不通时,可临时改用兼容模式:在
config/web.php中设'enablePrettyUrl' => false,URL 回退为?r=site/about形式,至少保证功能可用
PATHINFO 的关键不在框架侧,而在 Apache 是否把那段路径原样塞进 $_SERVER —— 所有调试都该从 var_dump($_SERVER) 开始,而不是先翻 Yii 文档。











