首页正常、内页404是因为nginx未将/user/list等请求转发给index.php处理,导致thinkphp未启动;根本原因是nginx配置缺失try_files转发、path_info设置错误或script_filename路径不正确。

为什么首页正常、内页404?
这不是路由写错了,而是 Nginx 根本没把 /user/list 这类请求交给 index.php 处理——它直接去文件系统找这个路径,找不到就返回 404。ThinkPHP 压根没启动,更别说解析路由了。
典型现象:/ 能打开,/index.php/user/list 也能通,但 /user/list 直接 404;或者 php think route:list 完全不显示你写的路由。
-
/index.php正常 → PHP 和框架基础环境没问题 -
/index.php?s=/user/list正常 → 路由定义和控制器逻辑大概率没问题 -
/user/list404 → 请求卡在 Web 服务器层,没进 PHP
Nginx 配置必须检查的三处硬性条件
缺一不可,漏掉任意一个都会导致内页 404。
-
location /块里必须有转发逻辑:推荐用try_files $uri $uri/ /index.php?$query_string;(TP6 入口在public/的话,要改成/public/index.php?$query_string;) -
fastcgi_param PATH_INFO $fastcgi_path_info;必须存在且位置正确(放在location ~ \.php$块内,不能漏) -
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;不能写成$request_filename,后者在重写后可能指向错误物理路径
特别注意:宝塔用户点「伪静态 → ThinkPHP」生成的规则多数是 TP5 风格,对 TP6 无效;必须手动改目标路径为 /public/index.php,并确认运行目录设为 /public(网站设置 → 运行目录)。
PATH_INFO 为空导致路由解析失败
即使请求进了 index.php,如果 $_SERVER['PATH_INFO'] 是空的,ThinkPHP 就无法从 URL 中提取 /user/list 这段路径,所有控制器都匹配不上。
- 检查 Nginx 配置里有没有
fastcgi_split_path_info ^(.+\.php)(/.*)$;(配合$fastcgi_path_info使用) - 确认
location ~ \.php$块中没有冲突的try_files $uri =404;—— 这行会提前截断请求,常见于宝塔默认的74.conf,必须注释掉 - 用
var_dump($_SERVER['PATH_INFO']);在入口文件开头测试,访问/user/list时应该输出/user/list,不是空字符串或/index.php
TP6 强制路由模式下静态资源被拦截
开了 'url_route_must' => true 后,/static/css/app.css 这类路径也会走路由匹配,找不到就 404 —— 它不会自动识别这是文件。
- 在
route/app.php最顶部加放行规则:Route::rule(':path^.*\.(js|css|png|jpg|gif|svg|woff2|ttf)$', 'static/:path', 'GET', ['ext' => '']); -
['ext' => '']很关键:禁用 ThinkPHP 自动补后缀,否则/a.js可能被当成/a.js.html去匹配 - 别用
Route::alias(),它硬编码了路径前缀,CDN 或子目录部署时失效
最后再强调一次:所有 404 都要先分清是 Nginx 返回的(HTTP 状态码 404 来自 nginx/1.x),还是 ThinkPHP 返回的(响应体含 “Route not found” 或自定义 404 页面)。前者查服务器配置,后者才看路由文件和框架开关。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











