Linux下ThinkPHP报错八成是环境问题:PATH_INFO未透传致路由失败、伪静态规则错误引发404、runtime目录权限与open_basedir限制冲突导致Permission denied,需逐层排查。

Linux 下部署 ThinkPHP 报错,八成不是代码问题,而是环境没对齐——尤其是 PATH_INFO、伪静态、目录权限这三块,只要其中一块没配准,include(): Filename cannot be empty、File not found、404 就会轮番上阵。
PATH_INFO 不生效导致路由解析失败
ThinkPHP 依赖 PATH_INFO 解析 index.php/xxx 这类 URL。但 Linux + PHP-FPM 默认不透传该变量,$_SERVER['PATH_INFO'] 为空,框架就找不到控制器,最终触发 include() 空文件名错误。
- 验证方法:在
public/index.php开头加var_dump($_SERVER['PATH_INFO'], $_SERVER['REQUEST_URI']); die();,访问/index.php/index/index,看输出是否含/index/index - Nginx 必须显式设置:
fastcgi_param PATH_INFO $fastcgi_path_info;(注意不是$path_info) - Apache 要确认启用了
mod_rewrite,且.htaccess中的规则没被服务器全局禁用(宝塔用户需手动开启“启用 Apache 伪静态”) - PHP-FPM 配置里不能有
security.limit_extensions = .php这类限制,否则index.php/xxx会被拒绝执行
伪静态规则写错或未启用
错误现象是所有非首页请求都返回 404,但 /index.php 能打开——说明入口文件可访问,但重写没生效。
- ThinkPHP 6+ 强制要求请求落到
public/index.php,Nginx 的location / { ... }规则必须匹配到子目录路径,比如部署在/myapp/,就得写location /myapp/ { ... } - 重写目标要补全物理路径:
fastcgi_param SCRIPT_FILENAME /var/www/html/myapp/public/index.php;,不能只写$document_root/index.php - 宝塔用户别只点“启用 ThinkPHP 伪静态”,还要进网站配置 → “伪静态” 标签页,确认内容是官方适配版(含
index.php?s=写法),且保存后重启了 Nginx - Apache 用户注意
.htaccess文件名是否被服务器忽略(有些主机禁用.htaccess),可临时改名为access.txt测试是否被读取
运行时目录权限与 open_basedir 限制冲突
报错提示 Permission denied 或空白页,但日志里没记录,大概率是 PHP 被 open_basedir 拦住了。
- 检查
php --ini输出的 CLI 和 Web 使用的php.ini是否为同一份;很多服务器 Web 用 fpm 配置,CLI 用 cli 配置,两者open_basedir设置可能不同 - ThinkPHP 的
runtime/目录必须可写,且其父路径(如/var/www/html/myapp/)要包含在open_basedir白名单里,否则缓存、日志、模板编译全部失败 - 不要写死绝对路径,用
:/var/www/html:/tmp这种宽松写法,避免漏掉vendor/或public/等实际需要访问的路径 - SELinux 启用时,即使 chmod 755 也可能被拦截,临时测试可执行
setenforce 0看是否恢复
真正卡住人的,往往不是某一个配置项写错了,而是多个环节叠加失效:Nginx 没传 PATH_INFO → 路由解析失败 → 框架尝试加载不存在的模板 → include('') 报错 → 错误处理器又因 open_basedir 无法写日志 → 最终只剩空白页。调试时得一层层剥开,别跳步。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











