Apache 的 .htaccess 文件未生效,需确认 mod_rewrite 已加载、Directory 配置 AllowOverride All、.htaccess 权限正常;ThinkPHP 要求 URL_MODEL=1、URL_PATHINFO_DEPR='/'、APP_DEBUG 开启;IIS 需 URL Rewrite Module 和 web.config 显式设置 PATH_INFO;关键是要确保 $_SERVER['PATH_INFO'] 有值,且 php.ini 中 cgi.fix_pathinfo=1。

Apache 的 .htaccess 文件没被读取
PATHINFO 在 ThinkPHP 中依赖 Apache 启用 mod_rewrite 并正确加载重写规则,而 Windows 下常见问题是 .htaccess 被忽略。不是配置错,是压根没生效。
-
httpd.conf中必须有LoadModule rewrite_module modules/mod_rewrite.so(确认未被注释) -
<Directory ""${SRVROOT}/htdocs">块内需包含AllowOverride All,不能是None - ThinkPHP 项目根目录下的
.htaccess文件权限要正常(Windows 下一般没问题,但若从其他系统复制可能带隐藏属性,建议右键 → 属性 → 取消“只读”) - 重启 Apache 后,访问一个不存在的路径(如
/test/abc),如果返回 Apache 默认 404 而非 ThinkPHP 的错误页,说明.htaccess没起作用
ThinkPHP 的 URL_MODEL 和 URL_PATHINFO_DEPR 配置不匹配
PATHINFO 模式不是开个开关就完事,它和分隔符、路由解析强耦合。Windows 下尤其容易因斜杠方向或大小写混淆出问题。
- 确保
URL_MODEL设置为1(PATHINFO 模式),不是2(兼容模式)或3(REWRITE) -
URL_PATHINFO_DEPR默认是'/',但如果你在 Windows 下用反斜杠'\'或空字符串测试过,务必改回正斜杠;ThinkPHP 内部用parse_url()处理,对\不兼容 - 检查
APP_DEBUG是否开启:关闭时部分 URL 解析逻辑会跳过调试输出,导致你误判“不生效”,建议先打开调试模式看日志里的PATHINFO解析结果
Windows IIS + PHP-CGI 环境下 PATHINFO 根本不支持
如果你实际用的是 IIS(比如通过 Microsoft Web Platform Installer 安装的 PHP),那不是配置问题,而是 IIS 对 PATHINFO 的支持极弱——它默认把 /index.php/module/action 当作完整路径,根本不会把后面部分传给 PHP 的 $_SERVER['PATH_INFO']。
- IIS 必须安装
URL Rewrite Module,并在站点根目录添加web.config,内容需显式提取并设置PATH_INFO环境变量 - 常见错误是直接套用 Apache 的
.htaccess规则,IIS 不认这个文件,也不会自动映射 - 验证方式:在控制器里打印
var_dump($_SERVER['PATH_INFO']),如果是null或空字符串,且$_SERVER['REQUEST_URI']包含完整路径,则基本确定是 IIS 未透传
PHP 的 cgi.fix_pathinfo 设置为 0 导致 PATHINFO 被清空
这是 Windows 下最隐蔽的坑。很多一键包(如 phpStudy、XAMPP)为安全起见默认关闭该选项,但它直接影响 $_SERVER['PATH_INFO'] 是否可用。
立即学习“PHP免费学习笔记(深入)”;
- 打开
php.ini,搜索cgi.fix_pathinfo,确认值为1(不是0或注释掉) - 改完后必须重启 Web 服务(不是仅重启 PHP-FPM),Apache/IIS 都要重载
- 验证方法:新建一个
info.php,写<?php phpinfo(); ?>,搜索页面中cgi.fix_pathinfo行,确认显示为On - 注意:设为
1在某些老旧 CGI 部署下有安全隐患,但 FastCGI(如 Apache mod_fcgid、IIS 的 PHP-CGI)下影响极小,ThinkPHP 场景下必须开
PATHINFO 生效与否,最终取决于 $_SERVER['PATH_INFO'] 这个变量有没有值,而不是 URL 长得像不像。所有配置都是为它服务,别被伪静态表象带偏。











