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

PhpRedirectHeaderLocation

Php Problem Overview


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");

}

Php Solutions


Solution 1 - Php

Try changing:

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

To

header("Location: blabla")

Solution 2 - Php

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');

Solution 3 - Php

In your form element add data-ajax="false". I had the same problem using jquery mobile.

Solution 4 - Php

Do not use any white space. I had the same issue. Then I removed white space like:

header("location:index.php"); or header('location:index.php');

Then it worked.

Solution 5 - Php

you may want to put a break; after your location:

header("HTTP/1.1 301 Moved Permanently");
header('Location:  '.  $YourArrayName["YourURL"]  );
break;

Solution 6 - Php

I had the same problem with posting a form. What I did was that turning off the data-ajax.

Solution 7 - Php

Are you sure the page you are redirecting too doesn't have a redirection within that if no session data is found? That could be your problem

Also yes always add whitespace like @Peter O suggested.

Solution 8 - Php

I got a solution for you, Why dont you rather use Explode if your url is something like

Url-> website.com/test/blog.php

$StringExplo=explode("/",$_SERVER['REQUEST_URI']);
$HeadTo=$StringExplo[0]."/Index.php";
Header("Location: ".$HeadTo);

Solution 9 - Php

Just change home to your liking

$home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/home';

header('Location: ' . $home_url);

Solution 10 - Php

// 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");

change to

// 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");
}

Solution 11 - Php

As "cfphpflex" suggested you can add break; after setting the header. You can also echo something, such as echo 'test';.

Solution 12 - Php

Add exit at the end of header then it will work

header("location:index.php"); or header('location:index.php'); exit;

Solution 13 - Php

You are suppose to use it like header(Location:../index.php) if it in another folder

Solution 14 - Php

use

header("Location: index.php"); //this work in my site

read more on header() at php documentation.

Solution 15 - Php

why all of this location url?

http://localhost:8080/meet2eat/index.php

you can just use

index.php

if the php files are in the same folder and this is better because if you want to host the files or change the port you will have no problem reaching this URL.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionvemoxyView Question on Stackoverflow
Solution 1 - PhpBuraCULaView Answer on Stackoverflow
Solution 2 - PhpschneckView Answer on Stackoverflow
Solution 3 - PhpkackleyjmView Answer on Stackoverflow
Solution 4 - PhpHasib OmiView Answer on Stackoverflow
Solution 5 - PhpcfphpflexView Answer on Stackoverflow
Solution 6 - PhpHadiView Answer on Stackoverflow
Solution 7 - PhpJoe BarbourView Answer on Stackoverflow
Solution 8 - PhpJomar DelfinView Answer on Stackoverflow
Solution 9 - Phpaary trivediView Answer on Stackoverflow
Solution 10 - PhpGULIM SHAHView Answer on Stackoverflow
Solution 11 - PhpshlgugView Answer on Stackoverflow
Solution 12 - PhpPreetView Answer on Stackoverflow
Solution 13 - PhpfaoudView Answer on Stackoverflow
Solution 14 - PhpAlexView Answer on Stackoverflow
Solution 15 - PhpHamza TrabelsiView Answer on Stackoverflow