如何将所有访客请求重定向到 Laravel 应用程序中的登录页面?

Posted

技术标签:

【中文标题】如何将所有访客请求重定向到 Laravel 应用程序中的登录页面?【英文标题】:How to redirect all guest requests to login page in Laravel app? 【发布时间】:2016-09-13 13:59:25 【问题描述】:

如果他们尝试访问不存在的路由,我想将所有未经授权的用户(也就是未登录的用户)引导到登录屏幕甚至。目前,如果他们尝试访问仅限授权用户的页面,我的设置会成功重定向他们,但如果他们尝试访问不存在的页面,则会引发正常的 404 错误;我希望这些请求也重定向到登录页面。这是我当前的设置:

// for localization purposes, this needs to be outside the localization group
Route::post('login', 'Auth\AuthController@login');
Route::post('register', 'Auth\AuthController@register');

// for localization of auth as well as normal pages
Route::group([
    'prefix' => LaravelLocalization::setLocale(),
    'middleware' => ['localeSessionRedirect', 'localizationRedirect'],
], function()

    // localized auth routes
    Route::get('login', 'Auth\AuthController@showLoginForm');
    // other localized auth routes...

    // if not logged in, redirect to login screen
    // (but throws a 404 if route doesn't exist)
    Route::group(['middleware' => ['guest']], function()
    
        return view('auth.login');
    );

    // Auth middleware group
    Route::group(['middleware' => ['auth']], function()
    
        // Post-Authentification Routes...
    );
);

【问题讨论】:

你使用什么 Laravel 版本? 4和5差别很大,甚至在5.0和5.2之间 【参考方案1】:

Laravel 默认抛出 NotFoundHttpException 如果客户端试图访问不存在的路由。

要处理此异常,您需要编辑 render() 下的方法 \app\Exceptions\Handler.php

所以要实现你的目标,你需要有这些步骤

捕捉异常(检查instanceof NotFoundHttpException) 检查用户是否经过身份验证。 如果未通过身份验证,则重定向到“/login”。

你会得到这样的东西

public function render($request, Exception $e)

    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException && !Auth::check()) 
            return redirect('/login');
    return parent::render($request, $e);

并继续使用auth 中间件来处理您只需要经过身份验证的用户才能访问的每个路由。

【讨论】:

这正是我所需要的!谢谢! 除了将客人重定向到登录之外,这似乎还将登录用户重定向到登录页面以防 404。我正在尝试找到解决方法但遇到问题,这就是我偶然发现这个问题的原因。似乎 Auth 在出现异常时不起作用,因为路由不匹配并且中间件(StartSession 和 Authenticate)没有运行。 (Laravel 5.3) @Tadej github.com/laravel/laravel/blob/… @Tadej github.com/laravel/framework/blob/…

以上是关于如何将所有访客请求重定向到 Laravel 应用程序中的登录页面?的主要内容,如果未能解决你的问题,请参考以下文章

你如何将所有请求重定向到 laravel 5 中的 public/ 文件夹

Laravel 5.2 - 在中间件请求中获取路由组名称

Laravel 5.2 如何将所有 404 错误重定向到主页

如何在 Laravel 4 中将一个路由重定向到 HTTPS,将所有其他路由重定向到 HTTP?

在laravel中发布请求后如何重定向回上一页?

将访客重定向到新网址,但不包括图片和管理员