大概率是服务器重写未配置:nginx需在location中设try_files $uri $uri/ /index.php?$query_string;(禁用=404),apache需启用AllowOverride All并确认.htaccess有效;其次检查路由顺序,如resource路由前置会拦截/test等固定路径;最后验证路由是否被加载、中间件是否提前终止请求。

路由定义了却报 404 Not Found,大概率不是“没写路由”,而是请求根本没进 Laravel 的路由分发逻辑,或者进了但被更早的规则拦截/匹配失败。下面几个点,挨个检查比改代码还快。
nginx 或 apache 没配好 rewrite,请求压根没到 index.php
这是最常被忽略的一环:Laravel 所有非 / 的路由都依赖服务器把请求重写到 public/index.php,否则 Web 服务器直接按文件路径找,自然 404。
- nginx:确认
location /块里有try_files $uri $uri/ /index.php?$query_string;(注意不是=404) - 如果项目部署在二级目录(比如
http://site.com/app/),try_files要改成/app/public/index.php?$query_string;,且root指向的是项目根目录,不是public - apache:确保
.htaccess文件存在且内容正确(含RewriteEngine On和转发规则),同时AllowOverride All已在虚拟主机配置中启用 - 用
curl -I http://your-site.com/some-route看响应头里的Server和X-Powered-By,如果没出现Laravel相关标识,基本可断定请求没进 Laravel
路由顺序冲突:{id} 吃掉了 /test 这类固定路径
当你混用 Route::resource() 和显式 Route::get(),且 URI 有前缀重叠时,Laravel 会按定义顺序匹配——先定义的优先,哪怕语义上更模糊。
Laravel 13.2.0 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 比如
Route::resource('posts', PostController::class)自动生成posts/{post},它会匹配/posts/test,然后尝试查 ID 为"test"的模型,查不到就抛ModelNotFoundException,最终渲染成 404 页面 - 解决方法:把更具体的路由(如
posts/test)写在resource之前 - 验证方式:运行
php artisan route:list --exact,看输出里/posts/test是否出现在/posts/{post}上方
中间件或 RouteServiceProvider 搞错了路由组加载时机
Laravel 12+ 的路由编译是静态缓存的,如果 RouteServiceProvider::mapWebRoutes() 里漏掉了某个 routes/web.php,或者中间件组绑定错位,路由就等于没注册。
- 检查
app/Providers/RouteServiceProvider.php中map()方法是否调用了mapWebRoutes()和mapApiRoutes() - 确认你的路由写在正确的文件里:
web.php(带web中间件)还是api.php(无 session/csrf) - 清掉路由缓存:
php artisan route:clear,再试;别只清 config 或 view 缓存 - 如果用了自定义中间件,在
app/Http/Kernel.php里确认它没在路由匹配前就return response()->view('404')或 throw exception
开发环境开了 debug 但没看到真实异常
有时候页面显示 404,其实是底层抛了异常(比如模型找不到、中间件拒绝、权限校验失败),但被 Handler.php 吞掉或降级成 404 渲染。
- 临时在
app/Exceptions/Handler.php的render()方法开头加if ($exception instanceof \Exception) { report($exception); dd($exception); } - 看控制台或日志里是不是有
No query results for model [App\Models\Xxx]或Target class does not exist这类信息 - 特别注意:Laravel 默认把
ModelNotFoundException渲染为 404 响应,但它本质不是路由错误,而是业务逻辑失败
真正卡住人的,往往不是“哪行代码写错了”,而是“请求根本没走到那行代码”。先确认服务器 rewrite 正常、再看路由是否真被加载、最后才查控制器和模型——顺序反了,花半天也白调。


















