PHP 404未找到头文件

8

我正在尝试理解这3行简单的PHP代码的组合:

这是代码:

ob_end_clean();
header('HTTP/1.0 404 Not Found');
exit;

所以这是代码,我理解第一行 ob_end_clean();,例如可以帮助处理BOM(字节顺序标记),所以第一行是为了防止任何之前的输出。

第二行header('HTTP/1.0 404 Not Found');是头文件。

第三行exit终止脚本的执行。

如果我去掉第一行并且文档中有一个BOM,我会得到空白页面(没有404)。

如果我删除第三行(带或不带BOM),我得到了我想要的页面,没有空白页和404。

  • 也许如果有人能解释一下为什么应该在404头之后使用exit
  • 还有为什么使用BOM时我不会得到“标题已发送错误”

谢谢您们,祝您们拥有美好的一天。


2个回答

11
如果我删除第一行,文档中有BOM,则会得到一个空白页面(不是404)。你得到了空白的404页面是因为在那里没有定义任何内容...
header('HTTP/1.0 404 Not Found');

仅仅是通知用户当前访问的是404错误页面... 如果你想为用户显示一些404提示,可以通过加载你的404.html文件来实现

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

或者直接

if (strstr($_SERVER['REQUEST_URI'],'index.php')){
    header('HTTP/1.0 404 Not Found');
    echo "<h1>Error 404 Not Found</h1>";
    echo "The page that you have requested could not be found.";
    exit();
}

exit函数的存在是为了防止执行其他php代码,这些代码可能直接跟在if后面或稍后执行,它简单地告诉程序“结束”


嘿Lukas,我理解你的if语句是为了让代码仅在索引页面上工作。 - Aviel Fedida
不,这是Apache对404页面的定义...我不知道你的代码情况如何,你只能使用IF语句中的内容。注意:header是针对“机器人”和“爬虫”的消息,echo是针对“人类”的消息... - Lukas Greso
我也尝试理解你的if语句,并且像我说的一样,我测试了它并返回了index.php字符串。还有,当你说“你只能使用IF语句的内容”时,你是什么意思?谢谢你,祝你有愉快的一天。 - Aviel Fedida
似乎你的 PHP 仍在运行中,PHP 只有在执行完成(到达 PHP 文件结尾)后才会打印输出。你必须通过 exit 手动停止它。如果你想在 404 页面上执行一些 PHP,请在发送 head 和 echo 之前执行。基本 PHP 的执行可能只需要几毫秒,用户不会注意到在他收到 404 消息之前已经处理了某些内容。 - Lukas Greso
那么,据我所知,事件序列如下:Php定义一个头文件,浏览器获取带有404头文件的响应(我假设可能在几毫秒内浏览器会显示404错误),但是因为我没有退出;php发送替换404错误的其余文件,我是对的吗? - Aviel Fedida
显示剩余2条评论

1

为什么在404标头后要使用exit

这样可以防止进一步的代码执行。如果没有其他内容,那就没关系,在这种情况下不是必需的。但养成好习惯总是有益的。

另外,为什么使用BOM时我不会收到“已发送标头错误”

您没有配置PHP安装程序以向最终用户显示错误和通知。


谢谢你的回答。关于404头部,如果可以,请告诉我为什么只有当我用(exit)杀死其余代码时,才会出现404错误?服务器向浏览器返回了什么?至于“headers already send”,你是正确的。 - Aviel Fedida
我不明白为什么浏览器只有在退出脚本后才会读取404头。 - Aviel Fedida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接