根本原因是nginx错误解析path_info导致php-fpm收到空或非法script_filename而返回空响应,nginx判定上游失败抛出502;常见于正则匹配失败使path_info为空、军哥lnmp enable-php.conf硬伤、宝塔默认规则未判空等场景。

ThinkPHP 5.0.22 伪静态报错,绝大多数情况不是框架 bug,而是 Nginx 或 Apache 没把请求正确交给 public/index.php,或者 PATH_INFO 解析失败导致路由压根没启动 —— 尤其常见于 502、404、"无法加载模块" 这三类错误。
为什么一开伪静态就 502 Bad Gateway
根本原因是 Nginx 把空的或非法的 PATH_INFO 传给了 PHP-FPM,FPM 拿到 SCRIPT_FILENAME 后发现路径不存在(比如拼出 /var/www//index.php),直接返回空响应,Nginx 就判定上游挂了。
- 检查 Nginx 的
location ~ \.php(.*)?$块:这个正则在匹配失败时会让$1为空,fastcgi_param PATH_INFO $1就变成PATH_INFO "",TP5 路由初始化直接中断 - 军哥 LNMP 的
enable-php.conf和宝塔默认规则都含这类硬伤,必须删掉旧 PHP location,改用try_files方式 - 用
curl -I http://yoursite.com/index.php/s/index/index测试:如果直接 502,基本锁定是 PATH_INFO 传递问题
Nginx 下 404 或 “无法加载模块” 怎么修
404 表示请求根本没进 PHP;“无法加载模块” 是 TP5 在 Dispatcher 里解析 $_SERVER['PATH_INFO'] 失败后抛出的典型错误 —— 两者本质都是入口没接住请求。
- 确认站点「运行目录」设为
/public(宝塔面板 → 网站设置 → 运行目录),否则root指向错误,try_filesfallback 到的/index.php实际是 404 - 伪静态规则必须写成:
try_files $uri $uri/ /public/index.php?$query_string;(注意是/public/index.php,不是/index.php) -
location ~ \.php$块里必须有:fastcgi_param PATH_INFO $fastcgi_path_info;,缺了这句 TP5 就拿不到 pathinfo - 别用
rewrite ^(.*)$ /index.php/$1 last;—— 它会丢掉QUERY_STRING,$_GET全空
Apache 下 .htaccess 不生效的排查点
TP5.0.22 默认入口是 public/index.php,但很多人把 .htaccess 放错位置或没开权限,规则压根不跑。
-
.htaccess必须放在public/目录下,不是项目根目录(即含application的那层) - Apache 配置中对应
<directory></directory>块里必须有AllowOverride All,且rewrite_module已启用 - 推荐规则末尾用
index.php?/$1(带问号),不是index.php/$1:后者在部分 Apache 版本下会丢参数 - 如果用了宝塔或 phpEnv,进 vhost 配置文件确认
<directory></directory>路径是否真实指向你的public目录
最易被忽略的是:TP5.0.22 的 url_route_on 默认为 true,但若环境变量或配置被覆盖(比如 APP_ENV=testing 且测试环境关了路由),也会静默失效。临时在 public/index.php 底部加一行 var_dump($_SERVER['PATH_INFO'], \think\App::instance()->route->rules());,看变量有没有、规则有没有加载 —— 比盲调配置快得多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











