ThinkPHP在Nginx上跑不起来主因是root未指向public目录、try_files写错、fastcgi_pass连不上或QUERY_STRING未传对;root必须为/var/www/myapp/public,try_files须用$uri $uri/ /index.php?$query_string,且需显式设置fastcgi_param QUERY_STRING $query_string。

ThinkPHP在Nginx上跑不起来,90%不是代码问题,而是Nginx配置没对准框架的运行机制。核心就四件事:root必须指向public目录、伪静态必须用try_files、PHP处理块要传对SCRIPT_FILENAME和QUERY_STRING、静态资源MIME类型得声明清楚。
root必须精准落到public目录
ThinkPHP 5/6/8 默认以public/为Web入口,Nginx的root指令必须直接写到这一层:
-
正确写法:
root /var/www/myapp/public;—— 请求/时能命中public/index.php -
错误写法:
root /var/www/myapp;—— 此时/index.php会去找项目根目录下的index.php,但该文件不存在 - 若因主机限制无法改
root,可用alias替代,但SCRIPT_FILENAME必须用$request_filename,否则路径拼错
伪静态只用try_files,别碰if
Nginx官方明确反对在location里用if (!-e $request_filename),它易引发重写循环、OPTIONS请求失败等问题。唯一推荐方式是:
- 在
location /块中写:try_files $uri $uri/ /index.php?$query_string; - 末尾必须是
?$query_string,不是/s=$1—— 后者是TP3.2的PATH_INFO老模式,TP6+默认走Query String - 这条规则不能塞进
location ~ \.php$里,必须放在最外层location /中
PHP处理块关键参数不能少
哪怕fastcgi_pass连通了,少了下面几行,$_GET为空、路由404、入口文件不执行都是必然结果:
立即学习“PHP免费学习笔记(深入)”;
-
fastcgi_pass unix:/run/php/php8.1-fpm.sock;(注意unix:前缀,别写localhost) -
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;($realpath_root自动解析软链,比$document_root更稳) -
fastcgi_param QUERY_STRING $query_string;(漏掉这句,$_GET永远是空数组) - 如需兼容PATH_INFO路由(比如老项目),才额外加
fastcgi_split_path_info ^(.+?\.php)(/.*)$;和fastcgi_param PATH_INFO $fastcgi_path_info;
MIME类型要补全现代资源
CSS、JS、WebP、SVG、WASM等资源若被当成text/plain或application/octet-stream返回,浏览器会拒绝执行或解析异常。解决方法分两步:
- 在
http块中确认有include mime.types;,并在其后追加自定义类型:
text/css css;
application/javascript js;
application/json json api;
image/webp webp;
image/svg+xml svg;
application/wasm wasm;
}
- 同时确保
default_type设为text/html(不是text/plain),否则/index.php无后缀时会被下载而非渲染



















