PHP标头(“Location:/404.php”,true,404)不起作用

时间:2011-05-26 16:56:33

标签: php redirect http-status-code-404

我想使用以下内容将数据库中不再存在的页面重定向到自定义404页面:

ob_start();
....
if ( !$found ):
  header( "Location: /404.php", true, 404 );
  exit();
endif;

但实际上这并没有重定向,只是显示一个空页面(因为在向浏览器输出之前调用了exit())。

我也尝试了以下内容:

if ( !$found ):
  header( "HTTP/1.1 404 Not Found" );
  exit();
endif;

我的.htaccess文件中有一个'ErrorDocument 404 /404.php',但这也只显示一个空页。

如果我这样做:

if ( !$found ):
  header( "HTTP/1.1 404 Not Found" );
  header( "Location: /404.php" );
  exit();
endif;

它确实重定向,但带有302标题。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:9)

我知道这是一个老问题,但我发现它很方便:

php将状态标题设置为404,并为正确的页面添加刷新,如2秒后。

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

然后,在重定向到fx搜索页面之前,您有404页面显示几秒钟。

就我而言,Symfony2,有一个异常监听器:

$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');
如果你希望很短的时间,

时间(2)可以是0.2。

答案 1 :(得分:7)

您不能拥有带位置的标题404:

如果要重定向,则应显示错误页面并使用新网址设置meta refresh

答案 2 :(得分:4)

我已经尝试并确保检查error_log文件,这是正确的方式是发送404标头,然后将错误页面包含到下一行。

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

最后,您必须对基于文本的浏览器使用exit()。

答案 3 :(得分:3)

我认为您的问题是因为您正在启动输出缓冲,或者因为您无法使用404重定向。第一个代码示例显示输出缓冲区已启动但退出而不是清除输出缓冲区并停止输出缓冲

将第一个示例更改为:

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

答案 4 :(得分:-7)

也许没有重定向?

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