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' );
问题根因
无限重定向的本质是重定向逻辑形成闭环,结合代码判断,问题来自以下两点:
- 路由中间件配置错误:登录路由被错误纳入
auth中间件保护范围,校验失败重定向回登录页时,auth中间件检测到用户未登录,再次重定向到命名为login的登录页,形成自循环;或guest(RedirectIfAuthenticated)中间件未正确放行登录页访问。 - 登录路由未加载
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
相关产品推荐
相关产品推荐

