为啥我的 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: "".$_SERVER['REQUEST_URI']."", 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 错误?
为啥这个 PHP 电子邮件脚本不会发送到我的 Yahoo 电子邮件?
为啥我在使用 Google Clas-s-room API 时会收到 404 错误?