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);
?>