ThinkPHP 5.1.36 伪静态失效主因是服务器配置与目录层级错位:Apache需将.htaccess置于public目录、启用rewrite模块、AllowOverride All,并用index.php?/$1规则;Nginx需设运行目录为/public、配置try_files指向/public/index.php、补全fastcgi_param PATH_INFO $fastcgi_path_info,且框架中url_route_on=true、pathinfo_depr='/'。

ThinkPHP 5.1.36 伪静态规则本身没变,但失效的主因几乎全是服务器配置和目录层级错位——不是规则写错了,而是 public 目录没被当运行根目录,或 PATH_INFO 没传进来。
Apache 下 .htaccess 必须放对位置且含关键参数
TP5.1.36 默认入口是 public/index.php,所以 .htaccess 必须放在 public/ 目录下,不是项目根目录(含 application 那层)。
- 检查 Apache 是否启用
rewrite_module:phpEnv 用户进「Apache 设置 → 模块管理」勾选;Linux 执行a2enmod rewrite - 确认站点 vhost 配置中存在且路径正确的
<Directory "D:/your/project/public">块,并含AllowOverride All -
.htaccess内容用这个(注意末尾是index.php?/$1,不是index.php/$1):
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>
漏掉 ? 会导致部分 Apache 版本丢参数,PT 标志必须保留,否则 PATH_INFO 解析失败。
Nginx 必须补全 fastcgi_param PATH_INFO
TP5.1.36 依赖 $_SERVER['PATH_INFO'] 解析路由,Nginx 默认不传,缺这行就会中断报错或 404:
立即学习“PHP免费学习笔记(深入)”;
- 在
location ~ \.php$块内,确保有这一行:fastcgi_param PATH_INFO $fastcgi_path_info; - 入口转发必须指向
/public/index.php,不能只写/index.php - 推荐用
try_files方式(比if更安全):
location / {
try_files $uri $uri/ /public/index.php?$query_string;
}
若用宝塔,网站「设置 → 运行目录」必须选 /public,否则 $_SERVER['DOCUMENT_ROOT'] 指向错误,runtime 目录写入失败,后续所有缓存、日志都崩。
框架配置里 url_route_on 和 pathinfo_depr 要匹配服务器行为
仅配服务器规则不够,TP5.1.36 还要确认框架层面没关路由、且分隔符和实际解析一致:
-
config/app.php中必须有:'url_route_on' => true -
'pathinfo_depr' => '/'(默认值,别改成-或.,除非你真用了自定义分隔符) - 别碰
url_common_param,TP5.1.36 默认关闭兼容模式,强行开反而导致参数解析错乱 - 如果部署在子目录(如
https://a.com/myapp/),try_files的 fallback 路径得写成/myapp/public/index.php?$query_string
最常被忽略的是:Nginx 的 fastcgi_param PATH_INFO 和 Apache 的 AllowOverride All 必须同时到位,缺一不可;而 .htaccess 放错目录(比如放到了项目根目录)是 phpEnv 和宝塔用户最高频的失误点。



















