if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
为什么不做这项工作?我得到空白页。
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
为什么不做这项工作?我得到空白页。
Answers:
您的代码在技术上是正确的。如果您查看该空白页的标题,则会看到404标题,其他计算机/程序将能够正确地将响应标识为未找到文件。
当然,您的用户仍然是SOL。通常,404由Web服务器处理。
问题是,一旦Web服务器开始处理PHP页面,它已经通过了可以处理404的点
除了提供404标头外,PHP现在还负责输出实际的404页面。
这是正确的行为,由您来创建404页面的内容。
蜘蛛和下载管理器使用404标头来确定文件是否存在。
(带有404标头的页面不会被Google或其他搜索引擎索引)
但是普通用户不会看http-header,而是将该页面用作普通页面。
为了记录,这是全情况处理程序:
<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");
$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
die()
必需的吗?
加载默认服务器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);
另一个基于@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和不存在的页面。
短一点的版本。抑制奇数回波。
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
尽管它可以使用一些改进,但您做对了。看起来已经解决了,所以让我们谈谈实际应用程序的好处:
我们拥有大量多语言技术文档的旧网站正在以其他条件执行此操作:
if (<no file found>){
die("NO FILE HERE");
}
问题(除了无用的消息和不良的用户体验之外)是,我们通常使用链接搜寻器(在我们的情况下为完整性)来检查不良链接和丢失的文档。这意味着我们得到了一个完全正确的200 no error响应,告诉我们那里有一个文件。Integrity不知道我们期望使用PDF,因此我们不得不手动使用php添加404标头。通过在裸片上添加代码(因为之后将不会执行任何操作,并且标头始终应始终在任何呈现的html之前),完整性(其行为或多或少类似于浏览器)将返回404,我们将确切知道丢失的位置文件。有更优雅的方法可以告诉用户错误,
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();
}
您知道,在我的网站上我创建了以下内容:
$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>");
}
希望对您有帮助。
如果要显示服务器的默认404页面,可以将其加载到这样的框架中:
echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';