ThinkPHP6伪静态配置与TP5三重不兼容:入口路径移至public目录、URL解析依赖PATH_INFO而非s参数、Nginx规则须严格置于location ~ .php$前并透传PATH_INFO,且多应用需捕获路径首段。

ThinkPHP5 和 ThinkPHP6 的伪静态配置表面看只是改条规则,实际是路由机制、入口结构、参数解析方式三重不兼容,直接套用 TP5 规则在 TP6 上必出 404 或白屏。
一、入口路径完全不同
TP5 入口文件默认在项目根目录:/index.php
TP6 强制要求入口必须在 public/ 子目录:/public/index.php
→ 若伪静态规则仍写成 /index.php?s=$1,Nginx 会尝试访问不存在的根目录下 index.php,直接返回 404。
二、URL 参数解析逻辑变了
TP5 默认走 $_GET['s'](即 s=/user/list)解析路由
TP6 默认关闭 s 参数模式,依赖 $_SERVER['PATH_INFO'] 或 $_SERVER['REQUEST_URI']
→ 即使重写到 /public/index.php?s=xxx,若没透传 PATH_INFO,框架启动时就会报错:URL pathinfo not supported
三、Nginx 规则位置和写法要求更严
TP5 规则可较宽松地放在任意位置,例如:
rewrite ^(.*)$ /index.php?s=$1 last;
TP6 必须:
- 规则写在
location ~ \.php$ { }之前(否则.php优先匹配,if 不执行) - 显式指向
/public/index.php - 必须用
last(break会导致 PATH_INFO 丢失,redirect暴露真实路径)
正确写法示例:location / { if (!-e $request_filename) { rewrite ^(.*)$ /public/index.php?s=$1 last; } }
四、配套环境配置不可省略
TP5 对运行目录、禁用函数、PATH_INFO 透传等要求宽松;TP6 是硬性依赖:
- 运行目录必须设为
/public(宝塔中下拉选择,不能手动填/或留空) - PHP 禁用函数中必须移除
putenv、ini_set、scandir(TP6 启动时靠它们初始化环境) - Nginx 的
location ~ \.php$块内必须有:fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info;
五、多应用模式差异更大
TP5 多应用靠子域名或 APP_SUB_DOMAIN_DEPLOY 开关;
TP6 多应用靠 URL 路径首段识别(如 /admin/login → admin 应用),伪静态规则必须捕获前缀:
if (!-e $request_filename) {
rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /public/index.php?s=$1/$2 last;
rewrite ^/(.*)$ /public/index.php?s=$1 last;
}
TP5 规则无法做这种两段捕获,自然所有子应用 404。
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











