I'd like to use the following to redirect pages that are no longer present in the database to the custom 404 page:
ob_start();
....
if ( !$found ):
header( "Location: /404.php", true, 404 );
exit();
endif;
But this actually does not redirect, but just shows an empty page (because of the exit() call before any output to the browser).
I've also tried the following:
if ( !$found ):
header( "HTTP/1.1 404 Not Found" );
exit();
endif;
With a 'ErrorDocument 404 /404.php' in my .htaccess file, but this also just shows an empty page.
And if I do this:
if ( !$found ):
header( "HTTP/1.1 404 Not Found" );
header( "Location: /404.php" );
exit();
endif;
It does redirect, but with a 302 header.
Any help would be greatly appreciated.
I think your problem is because of the output buffering you're starting, or because you can't redirect with a 404. The first code example shows the output buffer starting but exiting instead of cleaning the output buffer and stopping output buffering.
Change the first example to:
I know it's a old issue but I just found it handy:
php set status header to 404 and add a refresh to correct page, like a 2 seconds after.
Then you have the 404 page showing up a few second before redirecting to fx search page.
In my case, Symfony2, with a exception listener:
time ( 2) can be 0.2 if you wish very short time.
Maybe without redirect?
I've tried and make sure to check error_log file that is correct way is send 404 headers and then include error page to next line.
Finally you have to use exit() for text based browsers.
You can't have an header 404 with a Location:
You should display the error page and set a
meta refresh
with the new url if you want to redirect