'已发送的PHP标头'不再是问题?

时间:2014-02-04 07:54:07

标签: php html http-headers

在php手册(http://php.net/manual/en/function.header.php)中,我找到了以下关于http标题的内容:

QUOTE 请记住,在发送任何实际输出之前,必须通过普通HTML标记,文件中的空行或PHP来调用header()。使用include或require,函数或其他文件访问函数读取代码是一个非常常见的错误,并且在调用header()之前输出空格或空行。使用单个PHP / HTML文件时存在同样的问题。

<html>
<?php
/* This will give an error. Note the output
 * above, which is before the header() call */
header('Location: http://www.example.com/');
exit;
?>

ENDQUOTE

我现在尝试了这个(研究HTTP协议)并发现这似乎不再是一个问题;我想知道发生了什么变化:php处理解析网页的方式有变化吗?我尝试了几种浏览器(Chrome,IE10,IE7)和操作系统(Windows 8.1,XP),它们似乎都不再存在问题(请参阅informaticaschool.net76.net/httpdemo3.php获取完整上述内容的页面代码示例,没有给出错误。

有关在该服务器上运行的php版本的详细信息(我也尝试了不同的apache服务器),请参阅informaticaschool.net76.net/phpinfo.php。

我承认有点奇怪的是要问为什么不会发生错误,但正如我所指出的那样,我正在研究http的工作原理。现在查看Wireshark跟踪以了解在这种情况下究竟发生了什么,我之前知道这是一个问题,我现在惊讶地发现没有错误出现(并且没有在php手册中找到它的解释)。 / p>

2 个答案:

答案 0 :(得分:2)

该服务器已启用output_buffering,因此所有输出都被缓冲并保留,这使您即使在已生成输出后也可以将标头发送到Web服务器。请参阅the canonical answer about this issue部分“但它可以在其他服务器上运行!?”

答案 1 :(得分:1)

您必须在发送输出缓冲区之前发送标头。

或者您可以使用函数ob_startob_end_flush来保存输出缓冲区。