ThinkPHP5.0.23伪静态失败主因是入口路径、PATH_INFO传递与服务器配置未对齐;Apache需确保.htaccess在public目录、AllowOverride All且启用rewrite_module;Nginx须用try_files指向/public/index.php并显式传PATH_INFO;IIS需安装URL Rewrite Module 2.1且web.config置于public下。

ThinkPHP5.0.23 伪静态失败,基本不是框架 bug,而是入口路径、PATH_INFO 传递、服务器配置三者没对齐——尤其 public/index.php 这一层常被忽略。
Apache 下 .htaccess 不生效:检查 AllowOverride 和位置
常见错误现象是改了 .htaccess 但访问 /user/list 仍 404,而 /index.php/user/list 能打开。
- 确认
.htaccess文件放在public/目录下(和index.php同级),不是项目根目录 - 检查 Apache 的虚拟主机配置中,对应
<directory></directory>块里是否含AllowOverride All(仅FileInfo不够) - 确保
rewrite_module已启用:a2enmod rewrite(Ubuntu/Debian)或取消httpd.conf中LoadModule rewrite_module的注释 - 规则用这个精简版(去掉
<ifmodule></ifmodule>包裹,避免嵌套失效):RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
Nginx 下 404 或报 “URL pathinfo not supported”
错误提示直接指向 $_SERVER['PATH_INFO'] 为空,说明 Nginx 没把原始路径传给 PHP。
-
location /块必须写try_files $uri $uri/ /public/index.php?$query_string;(注意是/public/index.php,不是/index.php) -
location ~ \.php$块里必须加这行:fastcgi_param PATH_INFO $fastcgi_path_info;(漏掉就必然失败) - 确认 Nginx 的
root指向项目根目录(如/var/www/myapp),不是public子目录;否则$fastcgi_script_name解析会错位 - 别用
rewrite ^(.*)$ /index.php?s=$1 last;—— 它会丢$_GET参数,且易触发重定向循环
IIS 下 web.config 配置后仍 404
90% 是 URL Rewrite Module 没装,或 web.config 缺关键节点,导致请求根本没进 PHP。
立即学习“PHP免费学习笔记(深入)”;
- 必须安装 URL Rewrite Module 2.1,安装后运行
iisreset(不是重启网站) -
web.config必须放在public/目录下(和index.php同级),文件名全小写、UTF-8 无 BOM - rule 内必须有
<action type="Rewrite" url="index.php?s={R:1}" />,不能只匹配不重写 - ThinkPHP 配置里要设
'url_model' => 2(PATHINFO 模式),否则即使重写成功,框架也不认s=参数
验证 PATH_INFO 是否真正送达 PHP
别猜,直接看。在 public/index.php 开头加一行:
var_dump($_SERVER['PATH_INFO'] ?? 'MISSING'); die();
- 访问
/user/list,输出是字符串(如/user/list)→ PATH_INFO 正常 - 输出
MISSING或空字符串 → 服务器层没传,回退检查上一步配置 - 输出
/index.php/user/list→ 规则写成了index.php/$1但没加PT标志,Apache 把它当内部路径二次解析了
最易被忽略的是:ThinkPHP5.0.23 默认依赖 PATH_INFO,但 Nginx 和 IIS 都不默认提供,Apache 也得靠模块和配置激活——没显式补全,就等于没配。



















