为什么我的PHP应用程序不发送404错误?


140
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
}

为什么不做这项工作?我得到空白页。


1
更好的选择是发送404状态并立即包含您的自定义404页面。那就是我曾经做过的。
2012年

在我的PHP服务器上,它可以完美运行。上面的行返回服务器的默认404页面。我想可以在服务器中配置它。
Elmue 2014年

Answers:


306

您的代码在技术上是正确的。如果您查看该空白页的标题,则会看到404标题,其他计算机/程序将能够正确地将响应标识为未找到文件。

当然,您的用户仍然是SOL。通常,404由Web服务器处理。

  • 用户:嘿,您在这个URI网络服务器上有什么需要给我的吗?
  • 网络服务器:不,我不,404!这是要显示404的页面。

问题是,一旦Web服务器开始处理PHP页面,它已经通过了可以处理404的点

  • 用户:嘿,您在这个URI网络服务器上有什么需要给我的吗?
  • 网络服务器:是的,我知道,这是一个PHP页面。它会告诉您响应代码是什么
  • PHP:嗨,天哪404 !!!!!!!
  • Web服务器:糟糕,人们已经回到了404页,所以我将随PHP一起发送给我

除了提供404标头外,PHP现在还负责输出实际的404页面。


49
不管是否是14岁的女孩,小俗气的对话对我来说确实很有意义。
rbwhitaker 2012年

20
PHP 当时是 14岁
Adam Lynch

1
堆栈溢出需要为+1添加功能。这将获得所有+1。
杰伊·奎里多

30
那就是应该写文件的方式!特别是Apache文档,我真的很讨厌:)
哈里

4
血腥的精彩解释!让我开心!
Andrei Cristian Prodan 2014年

78
if (strstr($_SERVER['REQUEST_URI'],'index.php')){
    header('HTTP/1.0 404 Not Found');
    echo "<h1>404 Not Found</h1>";
    echo "The page that you have requested could not be found.";
    exit();
}

如果您查看最后两行回显线,则将在其中看到内容。您可以根据需要自定义它。


74

这是正确的行为,由您来创建404页面的内容。
蜘蛛和下载管理器使用404标头来确定文件是否存在。
(带有404标头的页面不会被Google或其他搜索引擎索引)

但是普通用户不会看http-header,而是将该页面用作普通页面。


20
FWIW,如果为404,则如果内容很短,则IE返回其标准的“未找到”页面(它假定服务器只是在说“未找到”,并决定向用户显示更好的页面)。
Serge Wautier 2011年


14

加载默认服务器404页面(如果有的话),例如为apache定义的页面:

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}

它无法正常工作,显示警告:readfile(404missing.html):无法打开流:/var/www/.com/public_html/index1.php在第61行上没有此类文件或目录

2
@AMB那是因为您必须自己创建该文件。
超级猫

@SuperCat谢谢,现在我重读了错误,一切现在都清楚了。,


4

另一个基于@Kitet的解决方案。

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");

$_SERVER['REDIRECT_STATUS'] = 404;
//If you don't know which web page is in use, use any page that doesn't exists
$handle = curl_init('http://'. $_SERVER["HTTP_HOST"] .'/404missing.html');
curl_exec($handle);

如果您要编程的网站不受托管,那么您将无法控制哪个文件是“ 404missing.html”。但是,您仍然可以这样做。

这样,您在同一服务器上提供了与普通404页面完全相同的结果。观察者将无法区分现有的PHP页面返回404和不存在的页面。


4

尝试:

header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');

再见!


2

短一点的版本。抑制奇数回波。

if (strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  exit("<h1>404 Not Found</h1>\nThe page that you have requested could not be found.");
}

2
if($_SERVER['PHP_SELF'] == '/index.php'){ 
   header('HTTP/1.0 404 Not Found');
   echo "<h1>404 Not Found</h1>";
   echo "The page that you have requested could not be found.";
   die;
}

永远不要简化echo语句,永远不要忘记上面的分号,也为什么要在页面上运行substr,我们可以轻松地运行php_self


2
因为REQUEST_URI与PHP_SELF不同。特别是如果您有URL重写。
Timo Huovinen

1

如果要显示服务器的默认错误页面,则必须在服务器中进行处理。


1

尽管它可以使用一些改进,但您做对了。看起来已经解决了,所以让我们谈谈实际应用程序的好处:

我们拥有大量多语言技术文档的旧网站正在以其他条件执行此操作:

    if (<no file found>){
        die("NO FILE HERE");
    }

问题(除了无用的消息和不良的用户体验之外)是,我们通常使用链接搜寻器(在我们的情况下为完整性)来检查不良链接和丢失的文档。这意味着我们得到了一个完全正确的200 no error响应,告诉我们那里有一个文件。Integrity不知道我们期望使用PDF,因此我们不得不手动使用php添加404标头。通过在裸片上添加代码(因为之后将不会执行任何操作,并且标头始终应始终在任何呈现的html之前),完整性(其行为或多或少类似于浏览器)将返回404,我们将确切知道丢失的位置文件。有更优雅的方法可以告诉用户错误,

    header('HTTP/1.0 404 Not Found');
    die("NO FILE HERE");

1

试试这个:

if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
    echo "<head><title>404 Not Found</title></head>";
    echo "<h1>Not Found</h1>";
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    echo "<p>The requested URL ".$uri." was not found on this server.</p>";
    exit();
}

0

您知道,在我的网站上我创建了以下内容:

        $uri=$_SERVER['REQUEST_URI'];
        $strpos=strpos($uri, '.php');
        if ($strpos!==false){
        $e404="The page requested by you: &quot".$_SERVER['REQUEST_URI']."&quot, doesn't exists on this server.";
        $maybe=str_replace('.php','',$uri);
        $maybe=str_replace('/','',$maybe);
        die("<center><h1>404</h1><hr><h3>$e404</h3><h3>Maybe try <a href=$maybe>www.leaveyortexthere.p.ht/$maybe</a>?</center>");

}

希望对您有帮助。


-4

我想到了这个问题。.我认为重定向到服务器上不存在的链接可能会成功!因为服务器将返回他的404:
header('Redirect abbb.404.nonexist');<肯定不存在


7
如果执行该操作,那还会返回302。最好不要重定向您的404。而是使用404状态代码并显示未找到的消息。
2012年

-17

如果要显示服务器的默认404页面,可以将其加载到这样的框架中:

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';

4
对于我在此网站上看到的最差答案,应该会收到某种徽章。
MadTurki 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.