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

时间:2009-01-12 22:26:20

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

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

为什么不这样做?我得到一个空白页。

16 个答案:

答案 0 :(得分:306)

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

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

  • 用户:嘿,你在这个URI网络服务器上有什么东西吗?
  • 网络服务器:不,我没有,404!这是一个显示404s的页面。

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

  • 用户:嘿,你在这个URI网络服务器上有什么东西吗?
  • 网络服务器:是的,我知道,这是一个PHP页面。它会告诉你响应代码是什么
  • PHP:嘿,OMG 404 !!!!!!!
  • 网络服务器:好的废话,404页面的人已经回家了,所以我只会发送PHP给我的任何内容

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

答案 1 :(得分: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();
}

如果您查看最后两条回音线,那么您将看到内容。您可以根据需要自定义它。

答案 2 :(得分:74)

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

普通用户不会查看http-header并将该页面用作普通页面。

答案 3 :(得分:16)

对于记录,这是全案例处理程序:

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

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->

答案 4 :(得分:14)

加载默认服务器404页面,如果您有一个页面,例如为apache定义:

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

答案 5 :(得分:13)

自PHP 5.4起,您现在可以http_response_code(404);

答案 6 :(得分:4)

另一种解决方案,基于@ Kitet's。

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和不存在的页面。

答案 7 :(得分:4)

尝试:

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

再见!

答案 8 :(得分: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.");
}

答案 9 :(得分: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

答案 10 :(得分:1)

如果您希望显示服务器的默认错误页面,则必须在服务器中处理此问题。

答案 11 :(得分:1)

你做得对,虽然它可以使用一些提炼。看起来已经解决了,所以让我们谈谈实际应用的好处:

我们这个拥有大量多语言技术文档的旧网站在if else条件下执行此操作:

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

问题(除了无用的消息和糟糕的用户体验)是我们通常使用链接爬虫(在我们的例子中是完整性)来检查错误的链接和丢失的文档。这意味着我们得到了一个完全正确的200没有错误响应,告诉我们那里有一个文件。诚信不知道我们期待PDF,所以我们不得不手动添加404标头与PHP。通过在die上面添加你的代码(因为之后没有任何东西会执行,并且标题应始终在任何渲染的html之前),完整性(其行为或多或少类似于浏览器)将返回404并且我们将确切地知道在哪里寻找丢失文件。有更优雅的方式告诉用户存在错误,但是通过提供404错误,您不仅通知浏览器和类似浏览器的程序错误,而且(如果我错了,我相信 - 纠正我)也是在服务器日志中记录这些错误,您可以轻松地查找404s。

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

答案 12 :(得分: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();
}

答案 13 :(得分: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>");

}

我希望它可以帮到你。

答案 14 :(得分:-4)

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

答案 15 :(得分:-17)

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

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