ThinkPHP伪静态失效主因是PATH_INFO未传递,Apache需用E=PATH_INFO:$1规则,Nginx须配置fastcgi_param PATH_INFO $path_info;入口位置、路由开关及测试验证PATH_INFO是否生效同样关键。

阿里云服务器上 ThinkPHP 伪静态失效,90% 是因为 PATH_INFO 没传进去,不是规则写错,也不是没开 rewrite。
Apache 下 .htaccess 规则必须带 E=PATH_INFO
ThinkPHP 5/6 默认依赖 PATH_INFO 解析路由,但 Apache 的 mod_rewrite 在 FCGI 或某些 CGI 模式下不会自动设置它。直接抄官方规则 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 很大概率报 404 或 No input file specified。
- 正确写法(关键在
E=PATH_INFO:$1):<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [E=PATH_INFO:$1,QSA,PT,L] </IfModule> - 如果项目不在根目录(比如放在
/myapp/),要加RewriteBase /myapp/ - 宝塔面板用户:进网站 → 设置 → 伪静态 → 粘贴上面内容,**不要勾选“启用 Apache 伪静态”后再手动改 .htaccess**,容易冲突
Nginx 配置里 location ~ \.php$ 必须显式传递 PATH_INFO
Nginx 不像 Apache 自动拆分 PATH_INFO,fastcgi_param PATH_INFO $path_info; 这一行漏掉,ThinkPHP 就收不到路由参数,所有伪静态链接都 fallback 到首页或 404。
- 标准配置片段(注意
set $path_info和fastcgi_param PATH_INFO):location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; set $real_script_name $fastcgi_script_name; if ($fastcgi_script_name ~ "^(.+\.php)(/.+)$") { set $real_script_name $1; set $path_info $2; } fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; fastcgi_param SCRIPT_NAME $real_script_name; fastcgi_param PATH_INFO $path_info; } - 阿里云 ECS 上用宝塔:进网站 → 设置 → 配置文件 → 找到
location ~ \.php$块,确认包含上述set和fastcgi_param PATH_INFO逻辑 - 别用
try_files $uri $uri/ /index.php?$query_string;这种 Laravel 风格写法——ThinkPHP 不认QUERY_STRING里的 s 参数,必须走 PATH_INFO
ThinkPHP 路由开关和入口文件位置决定规则写法
伪静态规则不是通用的,得看你的入口是 public/index.php 还是根目录 index.php,以及是否开启路由。
立即学习“PHP免费学习笔记(深入)”;
- 入口在
public/目录(TP6 推荐):Nginx 的root必须指向public,.htaccess 放在public/下,规则里路径不能带public/ - 入口在根目录(旧 TP5 项目):.htaccess 放根目录,规则中
index.php是相对路径,不用写./index.php或绝对路径 - 必须开启路由:
'url_route_on' => true(TP5)或'route_enable' => true(TP6),否则即使重写成功,框架也按默认 query 参数解析,伪静态形同虚设
验证 PATH_INFO 是否生效的最简方法
别急着调页面,先用一个裸 PHP 文件测通路:
- 在网站根目录或 public 目录下建
test.php,内容:<?php var_dump($_SERVER['PATH_INFO'] ?? 'MISSING');
- 访问
http://yourdomain.com/test.php/hello/world - 如果输出
string(12) "/hello/world"→ PATH_INFO 正常;如果输出"MISSING"→ 重写规则或 Nginx fastcgi_param 配置一定有问题 - 这个测试绕过 ThinkPHP,能快速定位是服务器层还是框架层的问题
PATH_INFO 是 ThinkPHP 伪静态的命门,所有规则、配置、重启操作,最终都要落到它是否被正确注入到 $_SERVER 数组里。其他优化都是锦上添花,这里不通,全盘无效。



















