为什么我的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: "".$_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>"); }
我希望它可以帮助你。
我想到了这个问题..我认为,redirect到您的服务器上不存在的链接可能会伎俩! 因为服务器会返回他的404:
header('Redirect abbb.404.nonexist');
<那肯定不存在
如果你想显示服务器的默认404页面,你可以像这样在一个框架中加载它:
echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';