thinkphp路由404主因是请求未进入框架,需先验证是否抵达index.php:访问/index.php/route/test,若见thinkphp调试页则框架已接管,否则检查web服务器重写配置(nginx用try_files $uri $uri/ /index.php?$query_string;apache确认.htaccess存在且allowoverride all启用)、路由文件加载(php think route:list为空则route/app.php未执行)、强制路由下静态资源拦截(需显式放行)等问题。

ThinkPHP路由配置改完后访问URL仍报404,不是路由规则写错了,而是请求根本没抵达框架的路由解析层——此时修改route/app.php里的任何Route::get()都无效,必须先确认Web服务器是否把请求正确转发给了index.php。
第一步:验证请求是否真正进入ThinkPHP
在浏览器中直接访问http://your-domain.com/index.php/route/test(确保该路由未定义)。看到ThinkPHP调试页提示「找不到路由」,说明框架已接管;如果返回Nginx/Apache原生404页面,且响应头里没有X-Powered-By: ThinkPHP,那就停在这里——问题出在入口接管环节,别再调路由代码了。
用curl命令快速验证:curl -I http://localhost/index.php/route/test。若响应头含X-Powered-By: ThinkPHP,继续下一步;若只有Server: nginx或Server: Apache,说明PHP层根本没执行,跳转到「Web服务器重写配置检查」部分。
Web服务器重写配置检查
方法一(Nginx):打开站点配置文件,在server块内找到location /段,确认存在且仅有一条try_files指令:try_files $uri $uri/ /index.php?$query_string;
漏掉$query_string会导致GET参数丢失,$_GET为空,后续路由匹配必然失败;写成/index.php?s=$1是TP5旧写法,TP6/TP8不兼容。
方法二(Apache):确认public/.htaccess文件存在且内容为标准重写规则:
RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
【Linux服务器上,.htaccess文件名必须全小写】,写成.Htaccess或HTACCESS会直接失效。
方法三(宝塔面板用户):进【网站】→【设置】→【网站目录】→【运行目录】,必须选/public(开头带斜杠),改完点【保存】再【重启】站点,否则配置不生效。
检查路由文件是否被加载
第一步:在项目根目录执行php think route:list。
输出为空、或列表里根本没有你写的/user/list,代表route/app.php根本没被执行。
第二步:在route/app.php第一行加die('route loaded');,刷新任意URL。
没中断=该文件被跳过,常见原因有:
• TP8多应用模式下,路由写在route/app_name/route.php但未在config/app.php的app_map中声明;
• 路由文件里只有注释或return [];,实际无路由生效;
• config/app.php中'url_route_on' => true被.env里的APP_URL_ROUTE_ON=false覆盖。
排除静态资源拦截导致的404
开启强制路由后'url_route_must' => true,/static/logo.png也会404——因为静态路径默认不在白名单里,被当成“未定义路由”直接拦截。
解决方法:在route/app.php顶部添加显式放行规则:Route::rule(':path^.*\.(js|css|png|jpg|gif|svg|woff2|ttf)$','static/:path','GET', ['ext'=>'']);
【其中['ext' => '']关键,防止框架自动补.html后缀】。
同时检查Nginx配置中是否有冲突的location ~* \.(js|css|png)$规则——它会绕过PHP直接返回,导致静态资源无法走ThinkPHP的路由放行逻辑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











