Why won't my PHP app send a 404 error?

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

Why wont this work? I get a blank page.

146555 次浏览

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

然而,普通用户不会查看 http 标头,而是将页面作为普通页面使用。

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

如果你看最后两条回声线,你就会看到内容。你可以随心所欲地定制它。

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

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

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

  • 用户: 嘿,你有什么我在这个 URI 网络服务器?
  • 网站服务员: 不,我不知道,404! 这里有一个页面要显示给404。

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

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

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

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

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

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

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

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
header('HTTP/1.0 404 Not Found');
readfile('404missing.html');
exit();
}
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 语句,永远不要忘记上面的分号,也不要忘记为什么在页面上运行 subr,我们可以很容易地运行 php _ self

如果你想显示服务器默认的404页面,你可以像下面这样加载它:

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

声明一下,这是全套处理程序:

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


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

另一个解决方案,基于@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和不存在的页面。

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

我们以前的一个网站收集了大量的多语言技术文档,在一个 if else 条件下执行这个命令:

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

问题(除了没有帮助的信息和糟糕的用户体验之外)是,我们通常使用链接爬虫(在我们的例子中是完整性)来检查错误的链接和丢失的文档。这意味着我们得到了一个完全正确的200无错误响应,告诉我们那里有一个文件。Integrity 不知道我们期待的是 PDF,所以我们不得不用 php 手动添加一个404头文件。通过在骰子上面添加代码(因为之后不会执行任何东西,而且头应该总是在任何呈现的 html 之前) ,完整性(其行为或多或少像一个浏览器)将返回一个404,我们将确切地知道在哪里寻找丢失的文件。有更好的方式告诉用户有一个错误,但通过服务404错误,你不仅通知浏览器和类似浏览器的程序的错误,但(我相信-纠正我,如果我错了)也记录在您的服务器日志中的错误,你可以很容易地为404。

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

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

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


}

希望能帮到你。

试试:

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

再见!

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

试试这个:

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