404主因是请求未进入thinkphp路由系统,需优先排查web服务器重写配置、入口文件接管及路由注册位置;加/index.php能访问即伪静态未生效。

刚跑通ThinkPHP项目,一访问/user/list就报404,但加个/index.php就能打开——这不是你路由写错了,而是请求压根没进到框架里,Web服务器直接返回了原生404,ThinkPHP连初始化都没机会执行。
确认请求是否真正进入ThinkPHP
第一步:在浏览器访问http://localhost/index.php/route/test(确保该路由未定义)。如果看到ThinkPHP调试页提示「找不到路由」,说明框架已接管;如果直接返回Nginx/Apache原生404页面,且响应头里没有X-Powered-By: ThinkPHP,那就停在这里别往下调路由代码了——问题出在入口接管环节。
第二步:用命令行验证路由注册快照:php think route:list。输出为空、或列表里根本没有你写的/user/list,代表route/app.php根本没被执行。此时在route/app.php第一行加die('route loaded');,刷新任意URL,没中断=该文件被跳过。
【APP_DEBUG=true时,路由缓存形同虚设】即使你刚执行过php think route:cache,只要.env或config/app.php中最终解析出APP_DEBUG=true,缓存就不会参与匹配。
Apache用户:.htaccess没生效的典型表现
方法一:确认public目录下存在.htaccess文件,内容必须包含标准重写规则,例如:
复制AI写代码
1 RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1[QSA,PT,L]
方法二:最关键的一步——检查Apache配置中对应目录的
【Linux服务器上,.htaccess文件名必须全小写】写成.Htaccess或HTACCESS会直接失效。
Nginx用户:伪静态配置的三个致命坑
① location / 块内必须有且仅有一条try_files指令:try_files $uri $uri/ /index.php?$query_string;。缺$query_string会导致?id=123参数丢失,$_GET为空;写成/index.php?s=是TP5旧写法,TP6/TP8不兼容。
② fastcgi_param SCRIPT_FILENAME 必须设为$document_root$fastcgi_script_name,绝不能用$request_filename——后者在重写后可能指向错误路径,导致PHP解析失败。
这一步操作起来很简单,直接改Nginx配置就行。改完记得运行sudo nginx -t && sudo systemctl reload nginx,否则配置不会生效。
资源路由RESTful定义的七件事对不上
Route::resource()一句就能生成标准RESTful路由,但默认行为和常见预期不一致——不是“写了就跑通”,而是“写了还得对得上七件事”。
GET /users → 必须是index(),不是indexAction()或list()
POST /users → 必须是save(),不是store();否则表单提交永远进不了创建逻辑
GET /users/123 → 必须是read($id),参数名必须叫$id(或带类型提示如int $id),否则路由无法绑定
PUT /users/123和PATCH /users/123都走update(Request $request, $id),不能只写update($id),否则请求体取不到
DELETE /users/123 → 必须是delete($id),别写成destroy($id)
控制器必须继承think\Controller(不是think\BaseController),否则__call()拦截失效,资源方法直接报错“method not exists”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











