【发布时间】: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。有时我不得不将一个库包含在其中,因为库似乎出于奇怪的原因吐出随机回声或打印。但是,是的,归结为“你有泄漏,在标题之前将其堵住!”。