【问题标题】:Understanding odd usage of ob_start()?了解 ob_start() 的奇怪用法?
【发布时间】:2018-01-31 21:08:42
【问题描述】:

我在 utube 上找到了一个关于预防警告的视频:

“警告:无法修改标头信息 - 标头已发送”。在 以下链接:

https://www.youtube.com/watch?v=leIz1Q2LJr4

几年前我查看了这个网站上的解决方案,但它们似乎都不起作用,尽管这些解决方案是有意义的。

但是,这个对我有用的 utube 解决方案毫无意义,我想知道是否有人可以解释原因?

我无法使用header('location: filename') 打开新网页。我一直收到警告。我在索引页面的开头添加了ob_start()(根据视频,带有标题指令的 PHP 部分),突然警告消失了,页面开始打开。为什么会这样?

我认为ob_start() 关注的是正在打开的新页面而不是当前的活动文档?

我在下面添加了代码:

ob_start();
header('Content-Type: text/html');
header('X-Content-Type-Options: nosniff', false);
//stop cacheing of page
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Pragma: no-cache"); // HTTP/1.0
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("X-XSS-Protection: 1");
header("X-Frame-Options: SAMEORIGIN");

【问题讨论】:

  • ob_start 是围绕标题问题的“黑客”,您应该需要它
  • 最好的办法是解决问题stackoverflow.com/questions/8028957/…
  • 简单来说,规则是:你发送任何内容后不能发送任何标题ob_start 初始化服务器端输出缓冲区,其中收集任何内容而不实际发送它。这样,您可以回显内容(进入缓冲区),然后发送标头,然后“刷新”(发送)缓冲区中的内容。这并不意味着您严格需要它:您仅在发送标头之前生成内容可行时才需要它。
  • 不干净的代码需要 ob_start。有时我不得不将一个库包含在其中,因为库似乎出于奇怪的原因吐出随机回声或打印。但是,是的,归结为“你有泄漏,在标题之前将其堵住!”。

标签: php caching ob-start


【解决方案1】:

如果在发送 http 标头之前有任何输出,则会出现“无法修改标头信息”错误。

ob_start() 启动一个名为“输出缓冲”的 php 功能,这将阻止 php 直接输出数据(到浏览器)。相反,所有输出都“重定向”到缓冲区,并且只有在调用ob_flush()gets 时才会转换为输出,这反过来又会清除缓冲区。

在您的示例中,ob_start()“捕获”在发送标头之前创建的任何输出并解决您的问题。由于您的脚本中没有ob_flush(),所有以前都创建输出“消失”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2012-03-09
    • 2012-12-14
    • 2022-11-21
    • 2012-12-13
    • 2014-11-02
    • 2013-10-09
    相关资源
    最近更新 更多