Laravel中间件未执行redirect跳转反而返回NotFound问题排查
问题排查与修复方案
嘿,我帮你找出问题所在啦!你的中间件没执行跳转反而返回「Not Found」,主要是代码里有两个关键错误,咱们一步步拆解:
1. 路由参数调用了错误的方法
你通过$request->route('link')拿到的$uuid是路由里的字符串参数(或者null),不是Eloquent查询构建器对象,所以直接调用$uuid->first()完全是错的——这行代码会直接抛出「调用非对象方法」的错误,Laravel的错误处理可能把这个错误转化成了404页面,导致你看不到跳转逻辑执行。
正确的查询写法应该把first()放在查询构建器上:
$link = Link::where('uuid', $uuid)->first();
(where方法的第二个参数默认就是等于,所以=号可以省略,写法更简洁)
2. 没处理路由参数为空的情况
如果请求的URL没匹配到带link参数的路由,$request->route('link')会返回null。这时候即使修正了查询,也会变成查uuid为null的数据,可能不符合你的预期;甚至如果路由定义有问题,中间件根本不会运行,直接返回404。
额外要检查的点
- 确认中间件已经正确注册到对应的路由/路由组里,不然它根本不会生效;
- 确认路由定义正确,比如是不是
Route::get('/{link}', ...)这种形式,确保link参数能被正确捕获。
最后给你修正后的完整中间件代码:
public function handle(Request $request, Closure $next) { $uuid = $request->route('link'); // 先判断参数是否存在,避免空值查询 if (is_null($uuid)) { return redirect()->away('https://www.google.com'); } $link = Link::where('uuid', $uuid)->first(); if ($link === null) { return redirect()->away('https://www.google.com'); } else { return $next($request); } }
内容的提问来源于stack exchange,提问作者zoey
相关产品推荐
相关产品推荐

