早就听说," header()之前不能有任何输出"(html文本、echo 、include其它编码格式的文件)
原理:
对于使用HTTP 协议建立的每个请求,Web服务器产生的响应通常包括两个部分 – 标题和主体。
脚本开始执行时,它可以同时发送header(标题)信息和主体信息。 Header信息(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中。 这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题)。但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 代码块或 print() 调用),那么PHP就必须先发送所有的标题,然后再送出空行,终止 HTTP header,而在此之后才会继续发送主体数据。从这时开始,任何添加或修改标题信息的试图都是不允许的,并会发送上述的错误消息之一。
解决办法:
1、php.ini配置文件里面output_buffering=on
启用output buffering时,在脚本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP 4.0中使用,它具有中央化的输出机制)。你仍然可以修改,添加标题行,或者设置cookie,因为标题实际上并没有发送。最简单的情况是,当脚本终止时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。
2、在整个页面之前,也就是HTTP信息之后,把<?php ob_start(); ?>打开缓存,在脚本结束的时候再用ob_end_flush()关闭缓存。
<?php
ob_start();
echo "Hello\n";
setcookie("cookiename", "cookiedata");
ob_end_flush();
?>
In the above example, the output from
echo() would be stored in the output buffer until
ob_end_flush() was called. In the mean time, the call to
setcookie() successfully stored a cookie without causing an error. (You can not normally send headers to the browser after data has already been sent.)
详情见手册:http://php.net/manual/en/book.outcontrol.php【output buffer部分】