PHP header( “Location: /404.php”, true, 404 ) does not work

一个人想着一个人 提交于 2019-12-18 19:03:36

问题


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.


回答1:


Maybe without redirect?

if ( !$found ):
   include('../404.php');
   exit();
endif;



回答2:


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.

header('HTTP/1.1 404 Not Found');
header("Refresh:0; url=search.php");

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:

$request  = $event->getRequest();
$hostname = $request->getSchemeAndHttpHost();
$response->setStatusCode(404);
$response->setContent('<html>404, page not found</html>');
$response->headers->set('Refresh', '2;url='.$hostname.'/#!/404');

time ( 2) can be 0.2 if you wish very short time.




回答3:


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




回答4:


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.

<?php
header('HTTP/1.1 404 Not Found');
include 'search.php'; // or 404.php whatever you want...
exit();
?>

Finally you have to use exit() for text based browsers.




回答5:


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:

if (!$found) {
  ob_end_clean();
  header('Location: /404.php');
  exit();
}


来源:https://stackoverflow.com/questions/6142244/php-header-location-404-php-true-404-does-not-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!