You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel校验失败重定向后页面无限循环重载如何解决

问题说明

开发Laravel简易登录表单时,点击登录按钮后端可通过dd($request);确认正常接收提交数据,但提交数据未通过校验触发重定向逻辑时,页面自动刷新陷入无限重载循环。

相关代码

控制器代码

class UserController extends Controller
{
    
    public function loginView()
    {
        return view('admin-login');
    }
    
    public function userLogin(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required|alphaNum|min:8',
        ]);

        $user_data = [
            'email' => $request->get('email'),
            'password' => $request->get('password'),
        ];
    
        if (Auth::attempt($user_data)) {
            return redirect('/admin');
        } else {
            return back()->with('error', 'Wrong email or password');
        }
    }
}

登录表单代码

<form style="width: 23rem;" action="{{ route('login.custom') }}" method="post">
    @csrf
    <h3 class="fw-normal mb-3 pb-3" style="letter-spacing: 1px;">Log in</h3>

    @if ($errors->any())
    <div class="alert alert-danger alert-dismissible fade show" role="alert">
        <i class="fa-solid fa-triangle-exclamation"></i>
        <strong>Error!</strong> Wrong email or password
        <button type="button" class="btn-close" data-bs-dismiss="alert"
            aria-label="Close"></button>
    </div>
    @endif

    <div class="form-outline mb-4">
        <input type="email" name="email" placeholder="Enter a valid email address"
            id="email" class="form-control form-control-lg" value="{{ old('email') }}" />
        <span class="text-danger">@error('email') {{ $message }} @enderror</span>
    </div>

    <div class="form-outline mb-4">
        <input type="password" name="password" placeholder="Enter password" id="password"
            class="form-control form-control-lg" />
        <span class="text-danger">@error('password') {{ $message }} @enderror</span>
    </div>

    <div class="pt-1 mb-4">
        <button class="btn btn-primary btn-lg btn-block login-btn"
            type="submit">Login</button>
    </div>

</form>

路由代码

Route::get('/login', [UserController::class, 'loginView'])->name('login');

Route::post('custom-login', [UserController::class, 'userLogin'])->name(
    'login.custom'
);
问题根因

无限重定向的本质是重定向逻辑形成闭环,结合代码判断,问题来自以下两点:

  1. 路由中间件配置错误:登录路由被错误纳入auth中间件保护范围,校验失败重定向回登录页时,auth中间件检测到用户未登录,再次重定向到命名为login的登录页,形成自循环;或guest(RedirectIfAuthenticated)中间件未正确放行登录页访问。
  2. 登录路由未加载web中间件组:web中间件组负责启动Session、存储校验错误闪存数据,若路由未加载该中间件,校验错误信息无法持久化,每次重定向都会被识别为新请求重复触发校验逻辑,最终导致无限刷新。
修复方案
  • 修正路由中间件配置:登录相关路由(GET登录页、POST登录提交)需放在auth中间件保护范围外,仅对登录后才可访问的后台路由应用auth中间件,参考配置如下:
// 登录路由,使用guest中间件,已登录用户访问会直接跳转后台
Route::get('/login', [UserController::class, 'loginView'])->name('login')->middleware('guest');
Route::post('custom-login', [UserController::class, 'userLogin'])->name('login.custom')->middleware('guest');

// 后台路由,必须登录才能访问
Route::middleware('auth')->group(function () {
    Route::get('/admin', function () {
        return view('admin.dashboard');
    });
    // 其余后台路由放在这里
});
  • 确认路由加载web中间件:检查app/Providers/RouteServiceProvider.php配置,确保routes/web.php下的路由默认加载web中间件组,不要将登录路由放到无web中间件的路由组中。
  • 修正表单语法隐患:原代码中登录按钮的class属性存在引号不匹配问题,调整为标准写法:
<button class="btn btn-primary btn-lg btn-block login-btn" type="submit">Login</button>
  • 清除缓存生效:执行以下Artisan命令清除缓存,避免旧路由/配置干扰:
php artisan route:clear
php artisan config:clear
php artisan cache:clear

完成以上操作后,提交不符合校验规则的数据时,页面会正常停留在登录页展示错误提示,不会出现无限刷新问题。

内容的提问来源于stack exchange,提问作者Usama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:15:40