ThinkPHP 6/8 伪静态失败的核心原因是服务器转发路径与框架接收方式不匹配:TP6/8 强制入口为 /public/index.php 且依赖 PATH_INFO 或 REQUEST_URI,而宝塔默认“ThinkPHP”模板适配 TP5 的 s= 参数并指向 /index.php,导致 404;必须手动配置 if(!-e $request_filename) { rewrite ^(.*)$ /public/index.php?s=$1 last; }、设运行目录为 /public、启用 fastcgi_param PATH_INFO $fastcgi_path_info;、禁用 putenv 和 ini_set 禁用,并重载 Nginx。

ThinkPHP 5/6/8 伪静态不是换条规则就能通,核心在于「服务器转发路径」和「框架接收方式」必须严格对齐。TP5 默认走 s= 参数,TP6/8 默认走 PATH_INFO 或 REQUEST_URI,混用规则必然 404。
为什么 TP6/8 用宝塔“ThinkPHP”模板必失败
宝塔下拉菜单里的“ThinkPHP”伪静态模板是为 TP5 设计的,规则是 rewrite ^(.*)$ /index.php?s=$1 last;。但 TP6/8 入口强制在 public/index.php,且默认不读 $_GET['s'] —— 它依赖 $_SERVER['PATH_INFO'] 或 $_SERVER['REQUEST_URI'] 解析路由。
- 规则指向
/index.php,而真实入口是/public/index.php→ 直接 404 - 没启用
fastcgi_param PATH_INFO $fastcgi_path_info;→ 框架启动时报URL pathinfo not supported - PHP 禁用函数勾了
putenv或ini_set→ TP6/8 在public/index.php开头无法动态设置环境变量 - 运行目录没设成
/public(宝塔 → 网站 → 设置 → 运行目录)→$_SERVER['DOCUMENT_ROOT']指向错误,runtime目录写入失败
Nginx 配置中 try_files 和 if + rewrite 怎么选
try_files 是 Nginx 官方推荐写法,但实际在宝塔、phpEnv 等环境中常因版本或模块兼容问题失效;if + rewrite 虽被官方标记为“不推荐”,但在宝塔面板里反而更可控、容错率高。
- 宝塔用户:用
if (!-e $request_filename) { rewrite ^(.*)$ /public/index.php?s=$1 last; },必须放在location ~ \.php$块之前 - 手动编辑 nginx.conf 用户:优先用
try_files $uri $uri/ /public/index.php?$query_string;,但要确认fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;存在 - phpEnv 用户:只能用
if + rewrite,且必须显式补全fastcgi_param PATH_INFO $fastcgi_path_info;,否则 TP6/8 启动直接报错 - 所有场景下,
last不可替换为break或redirect——break会导致重写后不重新匹配 location,请求卡死在静态文件处理流程
多应用/子目录/子域名场景的路径陷阱
TP6/8 多应用不是靠目录自动识别的,得靠伪静态把第一段路径提取出来拼进 s 参数;子目录部署时,rewrite 中的路径前缀漏掉一个字符,整个路由就崩。
立即学习“PHP免费学习笔记(深入)”;
- 多应用(如
/admin/login):规则要捕获应用名,例如rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /public/index.php?s=$1/$2 last;,否则一律走默认应用 - 子目录部署(如站点在
/myapp/):rewrite 必须带前缀,rewrite ^/myapp/(.*)$ /myapp/public/index.php?s=$1 last;,且宝塔「网站目录」中的「根目录」要填完整路径(如/www/wwwroot/myapp) - 子域名(如
admin.example.com):每个子域名需独立server块,root必须指向含public/的目录,try_files或if规则不能少,否则请求根本进不了 PHP - 应用名含中文或特殊符号(如
user_v2):正则字符集要补全,比如把[a-z0-9A-Z_\-]改成[a-z0-9A-Z_\-\x{4e00}-\x{9fa5}](Nginx 需开启perl模块支持 Unicode)
最易被忽略的一点:改完伪静态规则后,必须点「重载 Nginx」,且要进 PHP-FPM 配置检查 security.limit_extensions 是否包含 .php —— 少了这个,哪怕规则全对,也会返回 502 或空白页。



















