ThinkPHP部署后白屏、500或路由失效,90%因runtime目录权限不匹配或PATH_INFO未透传:需对齐PHP进程用户(如www-data/nginx)、设chmod 775+g+s runtime,并在Nginx中用try_files $uri $uri/ /index.php?$query_string或正确配置fastcgi_param PATH_INFO。

ThinkPHP部署后出现白屏、500错误或路由全失效,90%源于runtime目录权限不对或PATH_INFO没传过去——这两处不调通,框架连启动日志都写不进,更别提路由分发和缓存生成。
runtime目录权限必须对齐PHP进程用户
第一步:查Nginx和PHP-FPM实际运行用户。执行ps aux | grep -E "(nginx|php-fpm)" | head -3,看USER列,常见是www-data(Ubuntu/Debian)或nginx(CentOS/RHEL)。
第二步:确认runtime目录归属。运行ls -ld runtime/,若Owner或Group不是上一步查到的用户,就立刻修正:chown -R www-data:www-data runtime/(Ubuntu)或chown -R nginx:nginx runtime/(CentOS)。
第三步:设权限为775并启用setgid位,确保新生成子目录自动继承组:chmod 775 runtime/ && chmod g+s runtime/。这比755更稳,避免后续log/、cache/、temp/子目录因继承问题报mkdir(): Permission denied。
【不要用chmod 777 runtime/】部分主机安全策略会拦截world-writable目录,且TP6的session文件、缓存键值若被未授权写入,等于敞开了后门。
Nginx必须透传PATH_INFO才能激活ThinkPHP路由
方法一:用try_files + query_string(推荐TP5/6默认模式)
在server块里找到location / { },替换为以下内容:
location / {<br> try_files $uri $uri/ /index.php?$query_string;<br>}
删掉所有fastcgi_split_path_info相关行——TP5.1+默认走query_string模式,留着反而会让$_SERVER['PATH_INFO']错乱,导致Route::rule()全部fallback到首页。
方法二:手动注入PATH_INFO(适配PATH_INFO模式)
仅当项目明确要求PATH_INFO(如旧版TP3或自定义路由规则),才在location ~ \.php$ { }块内添加:
fastcgi_split_path_info ^(.+\.php)(/.+)$;<br>fastcgi_param PATH_INFO $fastcgi_path_info;<br>fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
【SCRIPT_FILENAME必须用$realpath_root,不能用$document_root】软链接部署时$document_root会解析失败,导致502或Class not found。
宝塔面板用户绕过伪静态坑的实操路径
① 新建站点后,立即点「网站设置 → 根目录」,把路径从/www/wwwroot/your-site改成/www/wwwroot/your-site/public——这是硬前提,跳过就源码裸奔。
② 在「伪静态」选项卡里,**不要选Laravel或通用PHP模板**,直接清空内容,粘贴TP专用规则:
if (!-e $request_filename) {<br> rewrite ^(.*)$ /index.php?s=$1 last;<br>}
③ 点「保存」,再点「PHP版本设置 → 切换PHP版本」,哪怕当前已是正确版本也点一次——这步强制重载php-fpm配置,解决部分环境PATH_INFO不生效的问题。
④ 最后检查「防跨站隔离」是否开启。如果开启,进入「网站目录 → 设置目录权限」,把runtime目录权限单独设为可写,否则即使chown成功也会被拦截。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











