Tell me more ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

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

}
share|improve this question
can you show the code how you post the data? – xdazz Sep 19 '11 at 6:48
add comment (requires an account with 50 reputation)

4 Answers

Try changing:

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

To

header("Location: blabla")
share|improve this answer
add comment (requires an account with 50 reputation)

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');
share|improve this answer
I see. I've fixed the code (as shown above), but I'm still getting the same URL error. :/ I've changed to HTTP Authentication as I realised that's part of my assignment requirement, but I still am intrigued by this weird 'bug'. – vemoxy Sep 19 '11 at 14:33
have you tried different browsers to exclude a browser bug? – schneck Sep 19 '11 at 14:52
Note the kind of 'catch-all' that is usual in WP's root .htacces: RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] Check (i.e. by means of logging) if you get TWO passes after the redirect, your intentional redirect (re-caught by index.php) and another subsequent one that then gets it wrong... implementing an add_filter('[pre_]option_siteurl|home'); do quadruple enforce the new place to be might help you... – Fronker Nov 7 '12 at 14:47
As per RFC 2616, HTTP headers are case-insensitive. The Location header does not have to be capitalized. – dotancohen Jul 11 at 6:43
add comment (requires an account with 50 reputation)

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

share|improve this answer
Not sure why this was down voted, he is right. Must have to do with jquery mobile. stackoverflow.com/questions/8403242/… – kackleyjm May 3 at 3:33
add comment (requires an account with 50 reputation)

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

share|improve this answer
add comment (requires an account with 50 reputation)

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.