根本原因是Nginx未将请求转发至public/index.php,导致路由无法解析;需配置try_files或rewrite规则,确保所有非静态请求重写到/index.php?s=$1,并确认root指向public目录、PATH_INFO或QUERY_STRING正确传递。

ThinkPHP 在 Nginx 下部署后首页能打开但二级路由(如 /admin/login、/api/user)返回 404,根本原因是 Nginx 没有把所有请求正确转发给 ThinkPHP 的入口文件(通常是 public/index.php),导致 URL 路由无法被框架解析。
确认 Nginx 是否启用 PATH_INFO 或使用重写规则
ThinkPHP(尤其是 6.x)默认使用 PATH_INFO 模式 或 兼容模式(?s=xxx) 解析路由。Nginx 默认不支持 PHP 的 PATH_INFO,必须显式配置或改用重写方式。
- 检查当前 ThinkPHP 配置:
config/app.php中的'url_route_must' => true和'url_common_param' => false等设置是否合理 - 推荐统一使用 重写方式(更稳定),关闭 PATH_INFO 依赖
Nginx 配置必须包含完整的重写规则
在站点 server 块中,确保有以下标准重写配置(适配 ThinkPHP 6+,基于 public 目录):
注意:root 必须指向 your_project/public,不是项目根目录
立即学习“PHP免费学习笔记(深入)”;
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}或者更规范的写法(推荐,避免 if):
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}如果用了子目录(比如域名后是 /myapp/),还需在重写中补上前缀,例如:
rewrite ^/myapp/(.*)$ /myapp/index.php?s=/$1 last;
检查 PHP-FPM 是否传递了正确的 PATH_INFO(若坚持用 PATH_INFO 模式)
仅当 config/app.php 中设置了 'url_html_suffix' => '' 且未启用兼容模式时才需此配置。此时 Nginx 需手动拆分 PATH_INFO:
location ~ \.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
fastcgi_pass php-fpm:9000; # 根据实际调整
}⚠️ 实际中 PATH_INFO 容易出错,多数人应优先选上面的 ?s= 重写方案。
验证与调试小技巧
- 访问
/index.php?s=/admin/login—— 如果能正常打开,说明框架本身没问题,纯属 Nginx 路由转发缺失 - 查看 Nginx 错误日志:
tail -f /var/log/nginx/error.log,看是否有 “No input file specified” 或 rewrite 被跳过 - 确认
public/index.php文件存在且可读,PHP 进程有权限执行它 - 重启 Nginx:
sudo nginx -t && sudo systemctl reload nginx


















