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

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

为什么不做这项工作? 我得到一个空白页面。

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

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

  • 用户:嘿,你有这个URI的networking服务器吗?
  • networking服务器:不,我没有,404! 这是一个404页面显示的页面。

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

  • 用户:嘿,你有这个URI的networking服务器吗?
  • networking服务器:是的,这是一个PHP页面。 它会告诉你什么是响应代码
  • PHP:嘿,OMG 404 !!!!!!!
  • networking服务器:好吧,404页面的人已经回家了,所以我只会发送任何PHP给我

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

 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页面创build内容。
蜘蛛和下载pipe理器使用404头来确定文件是否存在。
(带有404头的页面不会被Google或其他search引擎编入索引)

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

为了logging,这是全情况处理程序:

 <?php header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); header("Status: 404 Not Found"); $_SERVER['REDIRECT_STATUS'] = 404; ?> <!-- 404 contents below this line --> 

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

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

由于PHP 5.4你现在可以做http_response_code(404);

另一个解决scheme,基于@ 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); 

如果您正在编写托pipe在服务器中的网站,则您无法控制,您将无法知道哪个文件是“404missing.html”。 但是,你仍然可以做到这一点。

通过这种方式,您可以在同一台服务器上提供与正常404页面完全相同的结果。 观察者将无法区分现有的PHP页面返回404和不存在的页面。

尝试与:

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

再见!

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

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

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

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

我们的一个拥有大量多语种技术文档的旧网站在其他条件下执行:

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

这个问题(除了无用的消息和糟糕的用户体验之外)是我们通常使用链接爬虫(在我们的情况下是完整的)检查错误的链接和丢失的文档。 这意味着我们得到了一个完全正确的200没有错误的答复,告诉我们那里有一个文件。 诚信不知道我们正在期待一个PDF,所以我们不得不手动添加一个404头与PHP。 通过在代码上面添加你的代码(因为之后没有任何事情会执行,并且头文件总是在任何呈现的html之前),完整性(其行为或多或less像浏览器)将返回404,我们将确切地知道在哪里寻找丢失文件。 有更好的方法告诉用户有错误,但是通过提供404错误,你不仅可以通知浏览器和类似浏览器的错误程序,而且(如果我错了,我相信 – 纠正我)也是将这些错误logging在你的服务器日志中,你可以很容易地查看404s。

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

尝试这个:

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

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

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

我希望它可以帮助你。

我想到了这个问题..我认为,redirect到您的服务器上不存在的链接可能会伎俩! 因为服务器会返回他的404:
header('Redirect abbb.404.nonexist'); <那肯定不存在

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

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