JasonDavis
JasonDavis

Reputation: 48973

PHP header redirect not working

I know this has been covered before but I cannot find an answer to this,

I have always used this;

header("Location: http://www.website.com/");
exit();

This has always worked in my current project and all of a sudden it is not working in any of my browsers

I would like to figure out the problem and fix it instead of using

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>";

I also have error reporting enabled and it shows no errors

// SET ERROR REPORTING
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
ini_set('display_errors', TRUE);

Any ideas why it will not work?

Upvotes: 15

Views: 69276

Answers (14)

Mike B
Mike B

Reputation: 32155

Try:

<?php ob_start();?> --------->this code also

error_reporting(E_ALL | E_WARNING | E_NOTICE);
ini_set('display_errors', TRUE);


flush();
header("Location: http://www.website.com/");
die('should have redirected by now');

See what you get. You shouldn't use ^ (xor) in your error_reporting() call because you're unintentionally asking for all errors EXCEPT notices and warnings.. which is what a 'headers already sent' error is.

Edit:

Also try putting flush() right above your header() call.

Upvotes: 27

Luis H Cabrejo
Luis H Cabrejo

Reputation: 324

Had the same issue but for reloading. Was not reloading at all.

Fixed with this

echo "<script type='text/javascript'>location.reload();</script>"; exit;

I think it depends on the text editor used, encoding used, and windows or linux based php used, based on the other guys are commenting, could be many issues.

Upvotes: 0

T.Todua
T.Todua

Reputation: 56557

COMMON PROBLEMS:

1) there should not be any output (i.e. echo.. or HTML codes) before the header(.......); command.

2) there should not be a white-space(or newline) before <?php and after ?> tags.

3) GOLDER RULE! - the file (and other include()-d files) should have UTF8 without BOM encoding (and not just UTF-8). That is problem in many cases (because typical UTF8 encoded file has something special character in the start of file output)!!!!!!!!!!!

4) When redirecting, after header(...); you must use exit;

5) Recommended practice - always use 301 or 302 in reference:

header("location: http://example.com",  true,  301 );  exit;

6) If none of above helps, use JAVSCRIPT redirection(but it's highly not recommended By Google), but it may be the last chance...:

echo "<script type='text/javascript'>window.top.location='http://example.com/';</script>"; exit;

Upvotes: 21

Matt Croak
Matt Croak

Reputation: 2888

I actually had a case similar to this where I had an admin page that was included at the top of all my other pages. At the top of each page below the line:

<?php include '../../admin.php' ?>

I would have the php logic:

<?php if($_SESSION['username'] === null){ header("Location: ./adminLogin.php");}?>

The problem with this was that somewhere else I was also calling/manipulating the header(.... After a lot of time going through my code I admit I could not figure out where the problem was. Then I thought that each of these files hits my admin.php file before doing anything else. So I thought about what would happen if I would put the logic that was at the top of each of my views (because I didn't want anything to be visible unless you were logged in) into my admin.php file?

What happened was that before it even got to any of the php/html in my views it evaluated whether or not someone was logged in ($_SESSION['username'])) and if it was NULL then I just redirected to the adminLogin page. I put this logic right before my switch and it's worked perfectly for all my files that once required the logic. The way I had it worked in development, but posed a lot of issues in production. I found that moving the redirection logic to my admin.php file not only avoided the duplicate header(... manipulation but actually made my code more efficient by removing the excess logic from my view files and into my admin.php file.

Rather than putting the logic in every view file, put it in your controller once, before your switch. Works like a charm! This is useful if you don't want anyone to access any of the sensitive views unless they log in. In my case this was important for my CMS. However, if there are some files that you want to be viewable without logging in then I think the original logic would be sufficient. It seems like you already found a solution but hopefully this can be helpful if you run into this error again. :)

Upvotes: 0

Emre AYDIN
Emre AYDIN

Reputation: 734

If your index page is a html file, it may not work. Change it to index.php and use this code:

<?php

header("Location: http://ea.tc");

?>

Upvotes: 0

Umair Sultan
Umair Sultan

Reputation: 656

Try this (working for me):

echo '<script>window.location.replace("http://www.example.com")</script>';

Instead of

header("Location: http://www.example.com");

Upvotes: 2

Gayathri
Gayathri

Reputation: 126

Adding ob_start() solved this issue.

Upvotes: 1

lucorp
lucorp

Reputation: 36

Weird, but removing blank lines in php worked for me :-\

code before:

<?php

header("Location: http://www.website.com/");

?>

code that worked:

<?php header("Location: http://www.website.com/"); ?>

Upvotes: 0

Mahmoud Salem
Mahmoud Salem

Reputation: 104

It may be strange solution but try this, change the page encoding from utf8 to ANSI and it will work.

use any text editor and save the page as ANSI encoding and upload it to your online server.

Upvotes: 1

karto
karto

Reputation: 3668

try this. worked for me.

echo "<meta http-equiv='refresh' content='0;url=http://www.yoursite.com'>";

Upvotes: 6

Tyler Carter
Tyler Carter

Reputation: 61577

Try removing the Space Between location and the first h in http.

header("Location: http://www.website.com/");
exit();

turns into

header("Location:http://www.website.com/");
exit();

I had this problem on my WAMP Server.

Although it shouldn't be the problem, considering that is how it is documented in the PHP documentation. But you should probably try it anyway. I know it has worked for me in a number of cases.

Upvotes: 13

arbales
arbales

Reputation: 5536

You should also verify that you are redirecting to a valid location, and that the location has proper 404 and 500 error messages/pages setup. It could be that you are simply redirecting a bad place.

Upvotes: 0

Adam Byrtek
Adam Byrtek

Reputation: 12212

What exactly happens when you visit the page? You can try Firebug or any other tool that allows you to analyze HTTP headers and check if the redirect really happens and whether the Location header is really present.

Upvotes: 0

Toby Allen
Toby Allen

Reputation: 11211

Also when you are using the header function it has to be the first thing called before any text (even a space) is written to the client, so check again that there is no spaces being output prior to your call even before th

<?php

Upvotes: 1

Related Questions