Laravel中访客访问首页反复跳转至登录页问题求助(附控制器及路由代码)
访客访问Laravel首页被强制跳转至登录页面(未给首页路由添加中间件)
我现在遇到一个奇怪的问题:当我以访客身份访问Laravel项目的首页(路由是/)时,会反复被跳转到登录页面,但我明明没有给首页路由添加任何认证中间件。
以下是我的相关代码:
LoginController 代码
protected $redirectTo = '/'; public function __construct() { $this->middleware('guest')->except('logout'); } public function redirectToProvider() { return Socialite::driver(request()->provider)->redirect(); } public function handleProviderCallback() { $provider = request()->provider; $providerUser = Socialite::driver($provider)->user(); if($providerUser->getEmail() == null) { $user = User::where($provider . '_id', $providerUser->getId())->first(); } else { $user = User::where('email', $providerUser->getEmail())->first(); } if($user && $user->$provider . '_id' == null) { dd('test'); $user->update([$provider . '_id' => $providerUser->getId()]); } if(!$user) { $user = User::create([ 'email' => $providerUser->getEmail(), 'name' => $providerUser->getName(), $provider . '_id' => $providerUser->getId(), ]); } auth()->login($user, true); return redirect($this->redirectTo); // $user->token; } public function showLoginForm() { session()->put('previousUrl', url()->previous()); return view('auth.login'); } public function redirectTo() { return str_replace(url('/'), '', session()->get('previousUrl', '/')); }
路由代码
Route::get('/', 'WelcomePageController@index')->name('welcome'); Auth::routes(); Route::get('/login/{provider}', 'Auth\LoginController@redirectToProvider'); Route::get('/login/{provider}/callback', 'Auth\LoginController@handleProviderCallback');
现在我只能在登录状态下访问首页,希望能让访客直接访问首页,不确定问题出在控制器还是路由里,求各位大佬帮忙解决!
解决方案
嘿,我仔细看了你的代码和问题描述,大概率问题出在你没贴出来的WelcomePageController里,或者是路由缓存/全局中间件的问题,给你按优先级列排查步骤:
- 先检查
WelcomePageController的index方法
这是最可能的原因!哪怕路由没加auth中间件,如果控制器方法里手动加了登录判断,照样会把访客跳走。比如你可能写了类似这样的代码:
public function index() { if (!auth()->check()) { return redirect()->route('login'); } return view('welcome'); }
如果是这样,直接删掉这段登录判断逻辑就行,访客就能正常访问首页了。
- 清除路由缓存
有时候你之前给首页加过中间件,后来删掉但没清缓存,旧的路由规则还在生效。运行这条命令:
php artisan route:clear
然后再测试访客访问首页的情况。
检查全局中间件
打开app/Http/Kernel.php,看$middleware数组里有没有\Illuminate\Auth\Middleware\Authenticate::class这个中间件。如果有,说明你给所有路由都加了全局认证,这肯定会导致访客无法访问任何页面(包括首页),把它从全局数组里移除即可。确认
RedirectIfAuthenticated中间件逻辑
打开app/Http/Middleware/RedirectIfAuthenticated.php,默认逻辑是已登录用户访问登录/注册页时自动重定向,不会影响访客访问首页。如果这段代码被你修改过,比如搞反了判断逻辑,就可能出现异常跳转,把它改回默认逻辑就行:
public function handle(Request $request, Closure $next, ...$guards) { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { return redirect('/'); // 这里改成你想让已登录用户跳转的地址 } } return $next($request); }
另外,顺便给你优化下LoginController里的redirectTo方法,避免出现空字符串跳转的隐患:
public function redirectTo() { $previousUrl = session()->get('previousUrl', '/'); // 确保返回的是有效路径,不会出现空值 return str_starts_with($previousUrl, url('/')) ? substr($previousUrl, strlen(url('/'))) : $previousUrl; }
内容的提问来源于stack exchange,提问作者Muhammad Shahzaib
相关产品推荐
相关产品推荐

