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

Posted

技术标签:

【中文标题】为啥我的 PHP 应用程序不会发送 404 错误?【英文标题】:Why won't my PHP app send a 404 error?为什么我的 PHP 应用程序不会发送 404 错误? 【发布时间】:2010-10-01 00:53:33 【问题描述】:
if (strstr($_SERVER['REQUEST_URI'],'index.php')) 
    header('HTTP/1.0 404 Not Found');

为什么这不起作用?我得到一个空白页。

【问题讨论】:

更好的选择是发送 404 状态并立即包含您的自定义 404 页面。这就是我以前做的。 在我的 PHP 服务器上它运行良好。上述行返回服务器的默认 404 页面。我想这可以在服务器中配置。 【参考方案1】:

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

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

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

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

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

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

【讨论】:

不管是不是 14 岁的女孩,这个俗气的小对话对我来说真的很有意义。 Stack Overflow 需要为样式添加功能到 +1。这将获得所有的 +1。 文档应该这样写!特别是 Apache 文档,我真的很讨厌 :) 该死的精彩解释!让我开心! 对于所有注意到他们可以在他们的服务器上执行此操作的人。 nginx 提供了一个设置,使其能够捕获 PHP 错误状态并发送配置的错误页面。它被称为fastcgi_intercept_errors。不确定 apache 是否有等效设置。【参考方案2】:
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();

如果您查看最后两个回显行,您就会看到内容。您可以根据需要对其进行自定义。

【讨论】:

【参考方案3】:

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

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

【讨论】:

FWIW,在 404 的情况下,如果内容很短,IE 将返回其标准的“未找到”页面(它假设服务器只是说“未找到”并决定向用户显示更好的页面) .【参考方案4】:

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

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

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

【讨论】:

不,只需将这些内容放在文件顶部,然后继续自定义 404 页面。【参考方案5】:

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

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

【讨论】:

它不起作用,它显示警告:readfile(404missing.html):无法打开流:第 61 行 /var/www/.com/public_html/index1.php 中没有此类文件或目录 @AMB 那是因为你必须自己创建那个文件。 @SuperCat 谢谢,现在我重读了错误,现在一切都清楚了。,【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

尝试:

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

再见!

【讨论】:

【参考方案9】:

稍微短一点的版本。抑制奇数回声。

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.");

【讨论】:

【参考方案10】:
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

【讨论】:

因为 REQUEST_URI 与 PHP_SELF 不同。特别是如果你有 URL 重写。【参考方案11】:

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

【讨论】:

【参考方案12】:

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

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

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

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

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

【讨论】:

【参考方案13】:

试试这个:

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();

【讨论】:

【参考方案14】:

你知道,在我的网站上我创建了这样的东西:

        $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>");


希望对你有帮助。

【讨论】:

【参考方案15】:

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

【讨论】:

如果你这样做也会返回 302。最好不要重定向您的 404。而是使用 404 状态代码并显示未找到消息。【参考方案16】:

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

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

【讨论】:

这应该会收到我在这个网站上看到的最差答案的某种徽章。 @MadTurki There are much worse.

以上是关于为啥我的 PHP 应用程序不会发送 404 错误?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试访问我的 CodeIgniter 应用程序时,为啥会收到 404 错误?

htaccess 文件不会带我进入 404 错误页面

为啥这个 PHP 电子邮件脚本不会发送到我的 Yahoo 电子邮件?

为啥我在使用 Google Clas-s-room API 时会收到 404 错误?

为啥我的 javascript 文件是唯一获得 404 的文件? [复制]

为啥分页不起作用并在 wordpress 网站上出现 404 错误?