ThinkPHP伪静态需配置Nginx rewrite规则并禁用fastcgi_split_path_info;webroot必须指向public目录;runtime权限设为775并设置setgid;debug失效多因.env覆盖或配置缓存未清除。

ThinkPHP 伪静态规则怎么写才不 404
Linux 上 Nginx 默认不识别 ThinkPHP 的 PATH_INFO 模式,直接访问 http://example.com/index.php/home/index 能通,但去掉 index.php 就报 404——根本原因是没配对 rewrite 规则,且没关掉 fastcgi_split_path_info 的干扰。
实操建议:
- 在 server 块里加
location / { try_files $uri $uri/ /index.php?$query_string; },这是最稳的兼容写法(适配 TP5/6 的默认路由模式) - 删掉或注释掉
fastcgi_split_path_info相关行,TP 不依赖它,留着反而会让$_SERVER['PATH_INFO']错乱 - 确认
index.php在 root 下,且 Nginx 用户(如www-data或nginx)有读取权限,否则连入口文件都加载失败
public 目录为什么不能直接设为 webroot
很多人把整个 ThinkPHP 项目目录扔进 /var/www/html,然后发现 application/、config/ 这些敏感目录能被直接 HTTP 访问——这不是“省事”,是裸奔。
实操建议:
- Nginx 的
root必须指向public/子目录,不是项目根目录 -
public/外的目录(如application/、runtime/、config/)要确保不在 Web 可访问路径下;用ls -l看它们的父级目录权限,禁止被 Nginx 进程 traverse 到 - 如果必须共用一个域名子目录(比如部署在
/tp6),就用alias,但要注意结尾斜杠和index.php路径拼接问题,不如直接用子域名干净
runtime 目录权限设成 755 还是 775
设成 755 后经常报 mkdir(): Permission denied,日志写不进 runtime/log/,缓存生成失败——这不是权限太高,是太低,或者用户组没对上。
实操建议:
- 先查 Nginx 工作进程的用户:
ps aux | grep nginx | head -1,常见是www-data(Ubuntu)或nginx(CentOS) - 把
runtime/所属组改成该用户所属主组,并设权限为775:chgrp www-data runtime && chmod 775 runtime - 加上
setgid位,保证新生成的子目录自动继承组:chmod g+s runtime - 别用
777,TP6 的runtime里可能存 session 文件或缓存键值,开放过宽等于给未授权写入留后门
为什么 config/app.php 里的 debug=true 没生效
明明改了 config/app.php 里的 'debug' => true,页面还是显示 “The application is in production mode”,错误也不详细输出——大概率是环境变量覆盖了配置,或者缓存没清。
实操建议:
- 检查
.env文件是否存在且被加载:TP6 默认优先读.env,其中APP_DEBUG=true会强制覆盖 PHP 配置 - 运行
php think clear:config清掉配置缓存,TP5/6 都会缓存合并后的配置,改完app.php不清缓存等于白改 - 确认
APP_ENV是local或development,TP 内部逻辑里只有这两个环境才允许debug=true生效,production下会硬编码关掉调试
最常被忽略的是 .env 和配置缓存的双重影响,改完代码不看环境变量、不清缓存,问题永远在原地打转。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










