我正在尝试添加一个非常简单的访问者日志记录到我的 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,它只显示一次..
我期望它只运行一次? 有谁知道如何确保它只满足一个条目公关请求?
我认为您面临着来自浏览器的
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);
}
}
如果您在 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]);