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

Viv*_*nne 13 php redirect http-status-code-404

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

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

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

我也尝试过以下方法:

if ( !$found ):
  header( "HTTP/1.1 404 Not Found" );
  exit();
endif;
Run Code Online (Sandbox Code Playgroud)

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

如果我这样做:

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

它确实重定向,但有一个302标题.

任何帮助将不胜感激.

Jac*_*sen 10

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

php将状态标题设置为404并添加刷新到正确的页面,就像2秒后一样.

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

然后,在重定向到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');
Run Code Online (Sandbox Code Playgroud)

如果你希望很短的时间,时间(2)可以是0.2.


dyn*_*mic 7

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

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


小智 5

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

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

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