2011-05-26 67 views
13

我想使用以下命令将数据库中不存在的页面重定向到自定义404页面:PHP header(“Location:/404.php”,true,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头。

任何帮助将不胜感激。

+0

根据定义,重定向是302头代码,这会导致新的请求。一个404不应该在任何地方重定向 - 这是一个最终的在线代码。而不是重定向,只需做一个'include('404.php')'。 – 2011-05-26 17:00:52

+0

感谢您的所有输入。我去了头部(“HTTP \ 1.1 404 Not Found”),后面跟着一个404页面。每天学习新东西:-) – Vivienne 2011-05-26 17:19:14

+0

你应该选择一个答案 – dynamic 2011-05-28 01:36:13

回答

-6

也许没有重定向?

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

“endif;”真?请使用if(){},仅供将来参考 – AlanFoster 2011-05-26 17:03:30

+0

是的,这实际上会工作(我忘记提及,我也试过这个),但404.php页面,然后给出了一堆错误,因为某些包含文件,我不得不重写这个页面的很多代码。但如果没有其他的工作,我会尝试这个选项。感谢您的建议。 – Vivienne 2011-05-26 17:06:17

+0

@ user551841:为什么? – Vivienne 2011-05-26 17:06:52

6

你不能有一个位置的头404:

你应该用新的URL显示错误页面,并设置一个meta refresh,如果你想重定向

3

我觉得你的问题是,因为你开始输出缓冲,或者因为你不能用404重定向的第一个代码示例显示了输出缓冲启动,但退出,而不是清洗输出缓冲区并停止输出缓冲。

变化的第一个例子:

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

ob_end_clean(); < - 正是我想说的。尽管根本不需要使用ob_start()吗? – AlanFoster 2011-05-26 17:04:14

+0

如果我删除了404,重定向可以正常工作,如下所示:header(“Location:/404.php”,true)。这只是我想要一个404头被发送到浏览器,如果我这样做(这种情况下发送一个302头),情况并非如此。 – Vivienne 2011-05-26 17:11:23

4

我试过,确保检查的error_log文件,它是正确的方法是发送404头,然后包括错误网页下一行。

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

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

+0

这似乎是最好的办法。 – lfjeff 2017-10-18 21:43:08

7

我知道这是一个老问题,但我只是觉得方便:

PHP设置状态首部404,并添加刷新到正确的页面,像后2秒。

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

然后,您将404页面显示出来,然后重定向到fx搜索页面。

在我的情况下,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,如果你想很短的时间。