Laravel 12中API接口返回404 JSON响应被fallback路由拦截的问题求助
Laravel 12中API接口返回404 JSON响应被fallback路由拦截的问题求助
我最近在Laravel 12项目里卡壳了:API接口返回404 JSON响应时,总会被web路由里的fallback路由拦截,完全没法正常输出我想要的JSON 404结果。折腾了好几种方案都没解决,来请教各位大佬!
我的路由配置情况
首先说下当前的路由设置:
web.php 路由
最开始我用的是匹配Vue路由的写法:
Route::get('/{vue_capture?}', [VueController::class, 'getViewTemplate']) ->where('vue_capture', '^(?!docs\/api|docs\/api\.json)[\/\w\.-]*');
后来改成了fallback闭包:
Route::fallback(function() { return view('layouts.app'); });
但不管哪种写法,遇到API返回404的情况,都会触发这个路由返回Vue的视图,完全不是我要的JSON。
api.php 路由
我在api里定义了一个简单的测试路由:
Route::post('lookup', [Api\V1\Controller::class, 'lookup']);
这个路由里如果返回403的JSON响应,一切正常:
return response()->json(['message' => 'not found'], 403);
但只要返回404的JSON,就会被上面的fallback路由截胡:
return response()->json(['message' => 'not found'], 404);
我尝试过的解决方案
后来我给fallback路由加了Accept头判断,试图区分API和前端请求:
Route::fallback(function() { if (Request::header('Accept') !== 'application/json') { return view('layouts.app'); } else { return response()->json(['message' => 'not_found'], 404); } });
但这又带来了两个新问题:
- 就算走了JSON分支,最终返回的是Nginx的404页面,根本看不到我定义的JSON响应
- 更关键的是,这个API请求根本就不该走到fallback路由里,它应该直接在api路由里返回404才对
我还查了网上的方案,很多人说可以在ExceptionHandler里自定义404响应,但奇怪的是,我的请求根本没走到异常处理器里,完全没机会hook这个过程。
我的核心疑问
有没有大佬知道,怎么才能让Laravel在API接口返回404 JSON响应时,不触发web路由的fallback,直接输出我定义的404 JSON结果?
内容来源于stack exchange
相关产品推荐
相关产品推荐

