为什么 Laravel 中间件会被执行多次?

问题描述 投票:0回答:2

我正在尝试添加一个非常简单的访问者日志记录到我的 Laravel 站点,只需添加一个带有日志行的新中间件,但我在每个请求上收到两个日志条目?

中间件非常简单:

class LogVisitor
{
    public function handle($request, Closure $next)
    {
        Log::channel('access')->info($request->ip() .';' . $request->url());

        return $next($request);
    }
}

我什至尝试将日志记录行移至终止方法:

class LogVisitor
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate(Request $request, $response)
    {
        Log::channel('access')->info($request->ip() .';' . $request->url());
    }
}

但这并没有什么不同...... 我什至尝试向 $request 变量添加一个变量,并检查它是否已设置,但看起来 $request 变量也在每次执行时重置。

看起来整个事情被执行了两次,但是如果我尝试在里面创建一个 var_dump,它只显示一次..

我期望它只运行一次? 有谁知道如何确保它只满足一个条目公关请求?

laravel logging laravel-middleware
2个回答
3
投票

我认为您面临着来自浏览器的

OPTION
飞行前请求。

当您在您所在域之外的另一个域上发起请求时,浏览器会发起一个

OPTION
请求,您的中间件可能已捕获该请求。

如果

OPTION
请求返回 200,浏览器就会运行您需要的
Get/Post/..
请求。

试试这个

class LogVisitor
{
    public function handle($request, Closure $next)
    {
        if ($_SERVER['REQUEST_METHOD']!='OPTIONS') {
            Log::channel('access')->info($request->ip() .';' . $request->url());
        }
        return $next($request);
    }
}

0
投票

如果您在 Laravel 11 中遇到过这种情况。

#your middleware class
class EnsureUserIsLogin
{
    function handle(Request $request, Closure $next): Response
    {
        if ($_SERVER['REQUEST_METHOD']!='OPTIONS') {
            if (!Auth::check()) {
                return redirect('/');
            }
        }
        return $next($request);
    }
}

确保在目标路由中排除中间件。

Route::get('/', function () {
    return Inertia::render('Login');
})->withoutMiddleware([EnsureUserIsLogin::class]);
© www.soinside.com 2019 - 2024. All rights reserved.