Laravel redirect back to original destination after login Laravel redirect back to original destination after login laravel laravel

Laravel redirect back to original destination after login


For Laravel 5.3 and above

Check Scott's answer below.

For Laravel 5 up to 5.2

Simply put,

On auth middleware:

// redirect the user to "/login"// and stores the url being accessed on sessionif (Auth::guest()) {    return redirect()->guest('login');}return $next($request);

On login action:

// redirect the user back to the intended page// or defaultpage if there isn't oneif (Auth::attempt(['email' => $email, 'password' => $password])) {    return redirect()->intended('defaultpage');}

For Laravel 4 (old answer)

At the time of this answer there was no official support from the framework itself. Nowadays you can use the method pointed out by bgdrl below this method: (I've tried updating his answer, but it seems he won't accept)

On auth filter:

// redirect the user to "/login"// and stores the url being accessed on sessionRoute::filter('auth', function() {    if (Auth::guest()) {        return Redirect::guest('login');    }});

On login action:

// redirect the user back to the intended page// or defaultpage if there isn't oneif (Auth::attempt(['email' => $email, 'password' => $password])) {    return Redirect::intended('defaultpage');}

For Laravel 3 (even older answer)

You could implement it like this:

Route::filter('auth', function() {    // If there's no user authenticated session    if (Auth::guest()) {        // Stores current url on session and redirect to login page        Session::put('redirect', URL::full());        return Redirect::to('/login');    }    if ($redirect = Session::get('redirect')) {        Session::forget('redirect');        return Redirect::to($redirect);    }});
// on controllerpublic function get_login(){    $this->layout->nest('content', 'auth.login'); }public function post_login(){    $credentials = [        'username' => Input::get('email'),        'password' => Input::get('password')    ];    if (Auth::attempt($credentials)) {        return Redirect::to('logged_in_homepage_here');    }    return Redirect::to('login')->with_input();}

Storing the redirection on Session has the benefit of persisting it even if the user miss typed his credentials or he doesn't have an account and has to signup.

This also allows for anything else besides Auth to set a redirect on session and it will work magically.


Laravel >= 5.3

The Auth changes in 5.3 make implementation of this a little easier, and slightly different than 5.2 since the Auth Middleware has been moved to the service container.

Modify the new Middleware auth redirector

/app/Http/Middleware/RedirectIfAuthenticated.php

Change the handle function slightly, so it looks like:

public function handle($request, Closure $next, $guard = null){    if (Auth::guard($guard)->check()) {        return redirect()->intended('/home');    }    return $next($request);}

TL;DR explanation

The only difference is in the 4th line; by default it looks like this:

return redirect("/home");

Since Laravel >= 5.3 automatically saves the last "intended" route when checking the Auth Guard, it changes to:

return redirect()->intended('/home');

That tells Laravel to redirect to the last intended page before login, otherwise go to "/home" or wherever you'd like to send them by default.

Hope this helps someone else - there's not much out there on the differences between 5.2 and 5.3, and in this area in particular there are quite a few.


I found those two great methods that might be extremely helpful to you.

Redirect::guest();Redirect::intended();

You can apply this filter to the routes that need authentication.

Route::filter('auth', function(){    if (Auth::guest()) {           return Redirect::guest('login');    }});

What this method basically does it's to store the page you were trying to visit and it is redirects you to the login page.

When the user is authenticated you can call

return Redirect::intended();

and it's redirects you to the page you were trying to reach at first.

It's a great way to do it although I usually use the below method.

Redirect::back()

You can check this awesome blog.