codeigniter: how to redirect after login to current controller (php_self in regular php) codeigniter: how to redirect after login to current controller (php_self in regular php) codeigniter codeigniter

codeigniter: how to redirect after login to current controller (php_self in regular php)


I solved this problem myself by having a login form in the header that always submits to one login controller, but the catch is that the header login form (which appears on every page) always has a hidden input called redirect which the actual login controller captures...

Here's the basic set up (make sure the url helper is loaded):

The Header Login Form

<form action="/login" method="post">    <input type="hidden" name="redirect" value="<?php echo current_url(); ?>" />    <input type="text" name="username" value=""  />    <input type="password" name="password" value=""  />    <input type="submit" name="login" value="Login" id="submit"></form>

The Login Controller Form

<form id="login" action="" method="post">    <input type="text" name="username" id="username" value="" />    <input type="password" name="password" id="password" value=""/>    <?php if(isset($_POST['redirect'])) : ?>    <input type="hidden" name="redirect" value="<?php echo $_POST['redirect']; ?>" />    <?php endif; ?>    <input type="submit" name="login" id="submit" value="Login" />  </form>

The best part is you keep setting the redirect on failure and the redirect input only gets set if you're logging in from somewhere else.

The Controller

function index(){    if( ! $this->form_validation->run())    {        // do your error handling thing    }    else    {        // log the user in, then redirect accordingly        $this->_redirect();    }   }function _redirect(){    // Is there a redirect to handle?    if( ! isset($_POST['redirect']))    {        redirect("site/members_area", "location");        return;    }    // Basic check to make sure we aren't redirecting to the login page    // current_url would be your login controller    if($_POST['redirect'] === current_url())    {        redirect("site/members_area", "location");        return;    }    redirect($_POST['redirect'], "location");}

What's happening here is this:

  1. User logins on a different page.
  2. The login form submits to a single login controller with a hidden input element stating where they are logging in from.
  3. The login controller processes the login, then redirects based on the input.
  4. On failed login the redirect keeps getting set again, so no matter what, the user will return to the original page.

That's just a basic example. You can obviously tweak it as needed.


You can do it like this. Remember to load the session library and url helper.

$this->session->set_flashdata('redirectToCurrent', current_url());

Pass the above flashdata along with the login and redirect using:

redirect($this->session->flashdata('redirectToCurrent'));


I'm sure there may be a better way, but the way I do it is when the check if the user is logged in fails I use $this->session->set_flashdata('redirect_url', current_url()); and then pass it along with the login form so I know where to redirect the user back to.

Like I say, I'm sure there's a cleaner way to do this but I definitely don't like $_SERVER['HTTP_REFERER']; as it can't really be trusted.