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

为什么这行不通?我得到一个空白页。

4

16 回答 16

307

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

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

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

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

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

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

于 2009-01-13T01:39:44.080 回答
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();
}

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

于 2009-01-12T22:37:48.643 回答
74

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

但是,普通用户不会查看 http-headers 并将页面用作普通页面。

于 2009-01-12T22:32:59.823 回答
16

作为记录,这是所有情况的处理程序:

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

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
于 2012-10-07T07:20:35.133 回答
14

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

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}
于 2011-06-08T12:01:18.450 回答
12

从 php 5.4 开始你现在可以做http_response_code(404);

于 2013-12-17T21:50:11.963 回答
4

尝试:

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

再见!

于 2013-10-15T04:47:24.823 回答
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 和不存在的页面。

于 2013-07-02T03:45:26.803 回答
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

于 2011-06-19T05:20:06.350 回答
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.");
}
于 2010-10-10T05:55:12.070 回答
1

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

于 2009-01-12T23:37:58.447 回答
1

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

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

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

问题(除了无用的消息和糟糕的用户体验)是我们通常使用链接爬虫(在我们的案例中是完整性)来检查错误的链接和丢失的文档。这意味着我们得到了一个完全正确的 200 no error 响应,告诉我们那里有一个文件。Integrity 不知道我们期待的是 PDF,所以我们不得不手动添加 404 标头和 php.ini 文件。通过在模具上方添加您的代码(因为之后什么都不会执行,并且标题应该始终在任何呈现的 html 之前),完整性(其行为或多或少像浏览器)将返回 404,我们将确切知道在哪里寻找丢失文件。有更优雅的方式告诉用户有错误,

    header('HTTP/1.0 404 Not Found');
    die("NO FILE HERE");
于 2013-07-16T21:51:41.600 回答
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();
}
于 2015-07-22T05:35:03.803 回答
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>");

}

我希望它可以帮助你。

于 2013-08-10T23:20:19.770 回答
-4

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

于 2010-11-11T07:43:48.293 回答
-17

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

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';
于 2012-07-10T23:07:25.377 回答