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');
}
为什么这行不通?我得到一个空白页。
您的代码在技术上是正确的。如果您查看该空白页的标题,您会看到 404 标题,其他计算机/程序将能够正确地将响应识别为未找到文件。
当然,您的用户仍然是 SOL。通常,404 由 Web 服务器处理。
问题是,一旦 Web 服务器开始处理 PHP 页面,它就已经过了处理 404 的点
除了提供 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 页面的内容。
蜘蛛和下载管理器使用 404 标头来确定文件是否存在。
(带有 404 标题的页面不会被谷歌或其他搜索引擎索引)
但是,普通用户不会查看 http-headers 并将页面用作普通页面。
作为记录,这是所有情况的处理程序:
<?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);
尝试:
header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');
再见!
另一个基于@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($_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 (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 else 条件下执行此操作:
if (<no file found>){
die("NO FILE HERE");
}
问题(除了无用的消息和糟糕的用户体验)是我们通常使用链接爬虫(在我们的案例中是完整性)来检查错误的链接和丢失的文档。这意味着我们得到了一个完全正确的 200 no error 响应,告诉我们那里有一个文件。Integrity 不知道我们期待的是 PDF,所以我们不得不手动添加 404 标头和 php.ini 文件。通过在模具上方添加您的代码(因为之后什么都不会执行,并且标题应该始终在任何呈现的 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:
header('Redirect abbb.404.nonexist');
< 那肯定不存在
如果要显示服务器的默认 404 页面,可以将其加载到这样的框架中:
echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';