ThinkPHP 5.0 伪静态报错主因是请求未达控制器:参数丢失、PATH_INFO为空、入口路径错位或PHP-FPM拒绝执行;需用try_files $uri $uri/ /index.php?$query_string传递完整查询串,确保fastcgi_param PATH_INFO $fastcgi_path_info和cgi.fix_pathinfo=1,根目录应指向public,删除.public/.user.ini并关闭防跨站干扰。

ThinkPHP 5.0 伪静态后控制器访问报错,核心不是路由写错了,而是请求没真正抵达控制器——参数丢失、PATH_INFO为空、入口路径错位或 PHP-FPM 拒绝执行,这四类问题占了九成以上。
检查 Nginx 是否完整传递了查询参数
很多配置只写 rewrite ^(.*)$ /index.php?s=$1 last;,它只捕获路径部分,丢弃 ?id=123 这类 GET 参数,导致 $_GET 为空、$request->param('id') 拿不到值。
- ✅ 正确做法:用
try_files $uri $uri/ /index.php?$query_string;—— 它把整个查询字符串原样传过去,TP5.0 完全支持s=路由和额外参数共存 - ❌ 避免在
location ~ \.php$块里漏掉fastcgi_param QUERY_STRING $query_string;(虽然通常默认有,但宝塔某些模板会删) - 验证方式:直接浏览器访问
/index.php?s=index/index&id=999,如果能正常输出,说明框架没问题,问题出在 rewrite 环节
确认 PATH_INFO 是否被正确解析(尤其启用 pathinfo 模式时)
TP5.0 默认兼容两种模式:?s= 兼容模式 和 /index.php/module/action pathinfo 模式。若你启用了 'url_model' => 2(pathinfo),却报 “No input file specified” 或 “URL pathinfo not supported”,说明 $_SERVER['PATH_INFO'] 没传进来。
- 必须确保
location ~ \.php$块中包含:fastcgi_param PATH_INFO $fastcgi_path_info; - 检查
php.ini中cgi.fix_pathinfo = 1(Docker 或加固环境常被设为 0,需手动改回) -
删除或注释掉
fastcgi_split_path_info行——TP5.0 不依赖它,留着反而干扰 PATH_INFO 提取
核对入口文件路径与网站根目录是否匹配
TP5.0 项目结构通常是单入口:所有请求走 public/index.php 或根目录下的 index.php。但宝塔建站时默认把根目录设为项目整体(如 /www/wwwroot/myapp/),而实际入口在 /www/wwwroot/myapp/public/,这就导致 rewrite 规则里的 /index.php 找不到文件。
- 推荐做法:在宝塔「网站设置 → 根目录」中,把站点根目录直接指向 public 子目录(如
/www/wwwroot/myapp/public) - 若必须保留原根目录,则 Nginx 规则要显式带前缀:
try_files $uri $uri/ /public/index.php?$query_string; - 同时确认
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;—— 不能写成$request_filename,否则 PHP-FPM 无法定位真实文件
排查 .user.ini 和防跨站干扰
宝塔默认在 public/ 目录下生成 .user.ini,它会强制限制 open_basedir 和关闭 pathinfo,是隐藏的“报错触发器”。
- 进宝塔文件管理器,打开
public/目录,找到并删除或清空.user.ini - 进「网站 → 防跨站攻击」设置,白名单路径必须精确填到
/www/wwwroot/myapp/public/(结尾斜杠不可少) - 改完两项后,务必重启 PHP 服务 + 重载 Nginx 配置,否则不生效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











