thinkphp路由404主因是nginx未将请求转发至public/index.php:需配置try_files $uri $uri/ /index.php?$query_string,确保root指向public目录、script_filename正确、禁用fastcgi_split_path_info。

ThinkPHP路由失效,90%以上是Nginx没把请求交给public/index.php处理——它在文件系统里找/user/login这个真实路径,找不到就直接返回404,框架压根没启动。
先确认是不是伪静态问题
这是最关键的一步,别跳过:
- 浏览器访问
http://your-domain.com/index.php/user/login→ 能正常显示,说明框架本身没问题 - 再访问
http://your-domain.com/user/login→ 返回404,就坐实是Nginx转发失败 - 用命令快速验证:
curl -I http://localhost/index.php应返回200;curl -I http://localhost/user/login若返回404,问题100%在Nginx配置层
标准根目录部署配置(推荐)
适用于项目直接部署在域名根路径(如https://example.com/),入口文件物理位置是/var/www/myapp/public/index.php:
- 编辑站点Nginx配置(如
/etc/nginx/sites-available/your-site或宝塔对应配置页) - 在
server { }块内、location ~ \.php$之前插入:
try_files $uri $uri/ /index.php?$query_string;
}
- 检查PHP处理块中必须包含这一行(不能注释、不能缺失):
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - 确认
root指令写在server级,且指向public目录的绝对路径,例如:root /var/www/myapp/public;
若指向项目根目录(如/var/www/myapp/),会导致SCRIPT_FILENAME拼错路径,报“No input file specified”
子目录部署要改fallback路径
比如项目放在https://example.com/myapp/,入口文件实际是/myapp/public/index.php:
- 不能直接用
/index.php?$query_string,得带上子目录前缀 - 修改
location /块为:
try_files $uri $uri/ /myapp/index.php?$query_string;
}
- 同时确保
root仍指向项目根目录(如/var/www/html),这样$document_root/myapp/public/index.php才能被正确定位 - 如果用了
if + rewrite方式(如宝塔伪静态),重写目标也必须是/myapp/index.php?s=...,否则路由参数会丢失
别忽略这些隐藏雷区
即使Nginx配置看起来全对,也可能因以下原因静默失败:
-
url_route_on在config/app.php中是否为true?关闭状态下路由完全不加载 -
APP_DEBUG关闭时,路由错误可能只返回空白页或首页,建议临时开启调试模式 -
runtime/目录权限是否为755或775?写入失败会导致路由缓存无法生成 - 检查
fastcgi_params是否透传了HTTP_HOST头——域名绑定路由依赖这个值,漏掉会导致Route::domain()直接跳过
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











