PHP中可以修改HTTP header的几个函数如下:

header /header_remove

session_start/session_regenerate_id

setcookie/setrawcookie

如果在使用上面函数时出现了

Warning: Cannot modify header information - headers already sent (output started at script:line)

根本原因就是应该在output输出之前才可以修改header。什么是output 输出之前呢?有意无意的时候可以产生输出:

不知情的发生

  • <?php之前多了一个空格,或者?>之后多了一个空格
  • UTF-8 Byte Order Mark (UTF-8 BOM),文件字符集编码的问题。应查看你的PHP文件编码格式,如果是UTF-8 BOM的就会有这个情况。
  • 之前有错误或告警发生

特意产生输出

  • print, echo 以及其他可以产生输出的函数
  • <?php 之前有原始的<html>

HTTP协议中header 信息必须在page/output之前。PHP首先把header信息传给web server,  而且是一次性完成的,双分行符结束。如:

HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>

当PHP收到第一个output(print, echo,<html>)时,它将flush所有收集的header.这之后就不可以再发送header信息了。

 

常见的错误代码有:

<html>
    <?php session_start(); ?>
    <head><title>My Page</title>
</html>
...
 <?php
// 在 "<?php"之前多了一个空格
?>
<?php
echo "hello world"
setcookie('username',"supprman",time()-3600);
?>

 

发表评论