Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP header(Location: ...): Force URL change in address bar

I'm currently working on a mobile site with authentication using PHP sessions with a database. I have a login page with a form that goes to server_login.php on submit. The php file then creates some session data (store in $_SESSION), and redirects the user back to the index page:

header("location:../../index.php"); 

The new web page (index.php) loads correctly; however, when the header redirects the page, the URL at the address bar is not changed; it stays at *http://localhost/php/server/server_login.php* instead of http://localhost/index.php and thus all my other resources that makes use of relative pathing could not be loaded. It's as if the web page still thinks that it resides at /php/server instead of /.

Strangely, my other use of header("location: ...") at logout.php works and redirects the page successfully with a URL change.

I've made sure that there are no outputs in my *server_login.php* before the header redirect (above it are just mysql calls to check) and I've used ob_start() and ob_end_flush() too.

Are there any methods of forcing the URL on the address bar to change (and thus hopefully fix the relative path problem)? Or am I doing something wrong?

P/S: I am using jQuery Mobile.

EDIT: Here's my code for the redirection that doesn't change the URL:

// some other stuff not shown   $sql = "SELECT * FROM $user_table WHERE email = '$myemail' AND password = '$mypassword'"; $login_result = mysql_query($sql, $connection);  $count = mysql_num_rows($login_result);  if ($count == 1) {      // Successfully verified login information      session_start();      if (!isset($_SESSION['is_logged_in'])) {         $_SESSION['is_logged_in'] = 1;     }      if (!isset($_SESSION['email'])) {         $_SESSION['email'] = $myemail;     }     if (!isset($_SESSION['password'])) {         $_SESSION['password'] = $mypassword;     }      // Register user's name and ID     if ((!isset($_SESSION['name'])) && (!isset($_SESSION['user_id'])))  {         $row = mysql_fetch_assoc($login_result);         $_SESSION['name'] = $row['name'];         $_SESSION['user_id'] = $row['user_id'];     }      header("Location: http://localhost:8080/meet2eat/index.php");  } else {     // Not logged in. Redirect back to login page     header("Location: http://localhost:8080/meet2eat/php/login.php?err=1");  } 
like image 590
vemoxy Avatar asked Sep 19 '11 06:09

vemoxy


2 Answers

Try changing:

header("Location : blabla")                 ^                 |            (whitespace) 

To

header("Location: blabla") 
like image 81
BuraCULa Avatar answered Sep 17 '22 23:09

BuraCULa


Well, if the server sends a correct redirection header, the browser redirects and therefore "changes the url". It might be a browser issue, then. I don't know if it has anything to do with it, but you should not send a relative url in the location header ("HTTP/1.1 requires an absolute URI as argument to » Location: including the scheme, hostname and absolute path, but some clients accept relative URIs. ", http://php.net/manual/en/function.header.php), and "location" must be capitalized, like:

header('Location: http://myhost.com/mypage.php'); 
like image 29
schneck Avatar answered Sep 17 '22 23:09

schneck