当前位置:首页 > PHP教程 > php高级应用 > 列表

解决”Cannot modify header information

发布:smiling 来源: PHP粉丝网  添加日期:2018-10-24 13:49:22 浏览: 评论:0 

发送头消息前不能有任何输出,任何修改或者发送HTTP头的函数都必须在 任何形式的输出 之前被调用,一些函数会修改HTTP头:

header/header_remove

session_start/session_regenerate_id

setcookie/setrawcookie

而输出主要可能如下:

隐性输出

在 <?php 之前或者 ?> 之后的空格

UTF-8文件的 BOM头

之前出现的报错信息

显性输出

print , echo 和其它类似的输出函数

在 <?php 之间嵌入的原始html

为什么会出现Cannot modify header information – headers already sent by错误

为了理解为什么头消息必须早于输出,我们来看看典型的HTTP响应。PHP主要是生成HTML内容,但同时也传输了一组 HTTP/CGI 头给webserver:

  1. HTTP/1.1 200 OK 
  2.  
  3. Powered-By: PHP/5.3.7 
  4.  
  5. Vary: DontTrackMeHere 
  6.  
  7. Content-Type: text/html; charset=utf-8 
  8.  
  9. <html><head><title>PHP page output page</title></head> 
  10.  
  11. <body><h1>Content</h1> <p>Some more output follows...</p> 
  12.  
  13. and <a href="/"> <img src=internal-icon-delayed> </a> 

输出总是尾随头消息出现。PHP必须首先传头消息给网页服务器,并且只能传一个。在两个换行之后再也不能为头消息添加任何内容了。

当PHP收到第一个输出后(例:print,echo,…),它会刷新并发送设置的所有头信息。然后就可以就可以随心所欲的输出了,但是此时已经无法修改HTTP头信息了。

如何找到早于头消息的输出,报错信息中已经包含了所有相关能够定位错误的信息:

Warning: Cannot modify header information - headers already sent by (output started at /www/usr2345/htdocs/auth.php:52) in /www/usr2345/htdocs/index.php on line 100

可以看到header在文件的100行被调用。

“output started at” 则包含着更重要的信息:直接指名在auth.php的52行已经产生了输出。这就是我们需要找的。

一般情况:

print,echo

原始的HTML语句

<!DOCTYPE html>

  1. <?php 
  2. //已经不能修改或发送头消息了 
  3.  <?php 之前的空格 
  4. <?php 
  5. //这里有一个空格 
  6. UTF-8 BOM 

这是更不易察觉,但比较普遍出现的情况。确保用你的编辑器保存文件以“UTF-8 (no BOM)”方式保存。

报错信息形如 “Unknown on line 0”

一般这样的报错说明输出来自PHP扩展或者PHP.ini设置错误信息

Tags: Cannot modify header information

分享到: