方法:“php.ini文件中修改output_buffering = on,重启Apache,刷新
 

特别注意:(我就是看了这个才解决问题的) 
如果使用utf-8编码,一定要去掉UTF-8中的BOM,这都是因为utf-8编码文件含有的bom原因,而php4,5都是不支持bom的。去掉 bom,可以用Notepad++打开转换一下。(我就是看了这个才解决问题的)


 

比如以下这段PHP无法修改header信息的错误警告:

Warning: Cannot modify header information - headers already sent by

我们在刚刚开始编写PHP程序的时候,可能都遇到过这个问题。从字面上面看,意思是:

警告:不能修改header信息-headers已经发送。。。

那么是什么原因出现这个PHP无法修改header信息警告的呢!

就是当我们在header()或者setcookie()函数之前,有输出内容了,比如:

  1. < ?PHP
  2. echo "hello";
  3. header("content-type:
    text/html;charset:utf-8");
  4. ?>

上面的代码就会出现警告!

为什么在header和setcookie之前有任何的输出就会有警告错误呢!如果你了解了PHP的处理过程就很容易理解了!

那PHP是怎么处理PHP无法修改header信息的呢?

当脚本有任何输出的时候(第一次输出) PHP会先发送header信息给客服端 然后发送输出内容,(即http协议中的主体内容)这是如果你就不可能对已经发送的header信息进行任何的修改了,所以我们就不可能利用header 和setcookie等修改header的函数做任何事情了!

那我们来如果解决PHP无法修改header信息这个问题呢!

第一种方法很简单!就是尽量避免在header和setcookie之前有任何的输出内容。尽量将他们写在前面。

第二种解决办法就是利用PHP的outbuffer 输出缓冲,PHP的输出缓冲是这样的 ,将当前脚本的所有输出内容都放到outbuffer里面,当程序执行完毕之后 将header和outbuffer一并发送给客户端。

有两种做法 一种是在PHP.ini中开启outbuffer output_buffering默认值为0 可以设置为Off或者On 如果要限制输出缓冲区的最大值,可将该选项设定为指定的最大字节数(例如 output_buffering=4096)。

另一种PHP无法修改header信息方法是在PHP脚本中做开启:

在程序的开始出或者公共文件开始处 调用函数ob_start();

这样我们就开启了PHP的输出缓冲 下面我们就可以做任何操作了

  1. < ?PHP
  2. ob_start();
  3. echo "dfdfd";
  4. //注意不能卸载ob_start() 前面
  5. header("content-type:text/
    html;charset=utf-8");
  6. setcookie();
  7. ?>

如果要开始gzip 可以为ob_start添加ob_gzhandler回调函数 ob_start("ob_gzhandler");

关于outbuffer还有一些函数:

ob_flush() 
发送output buffer(输出缓冲)

ob_end_flush()
发送output buffer(输出缓冲)并禁用output buffering机制。

ob_end_clean()
清除output buffer但不发送,并禁用output buffering。

ob_get_contents()
将当前的output buffer返回成一个字符串。允许你处理脚本发出的任何输出。

ob_get_clean()
将当前的output buffer返回成一个字符串。允许你处理脚本发出的任何输出,并禁用output buffering机制。

还有一些函数可以参考PHP手册 搜索ob_

  1. < ?PHP
  2. ob_start();
  3. print "Here's a pretty dumb way 
    to calculate the length of a string.";
  4. $length = strlen(ob_get_content());
  5. ob_end_clean();
  6. ?>

这个PHP无法修改header信息例子显示了一个效率很低的确定字符串长度的方法。它不是简单的使用strlen()函数处理,而是先启用 output buffering 机制,将字符串打印出来,然后再确定output buffer的长度。最后清除output buffer(并没有发送),然后禁用output buffering机制。

header 无法实现跳转的更多相关文章

  1. php下载远程图片方法总结(curl手动解析header)curl跳转问题解决

    常用方法一般有:. file_get_contents file_put_contents readfile($file) //效率很高. 一般代码: /** * 抓取远程图片 * * @param ...

  2. ThinkPHP中header()无法发生跳转的解决办法

    一定要在header('Location:url')后加上exit()/die()才可以,特此记录.

  3. location跳转和header跳转的区别

    1:header("location:url") 跳转之前不能有任何输出,如果想在header之前有输出,则要修改php.ini文件.具体 output_handler =mb_o ...

  4. header('Location:'.C('VIP_HX').'/CmdId/'.$CmdId.'/user_id/'.$user_id.'/Token/'.$Token);

    利用header函数做跳转,跳转至C('VIP_HX')配置文件中VIP_HX的地址下,携带参数CmdId 值为 $CmdIduser_id 值为 $user_idToken 值为 $Token th ...

  5. PHP页面跳转(PHP笔记)

    目前学习到三种方法: 1.调用js跳转 2.header()跳转 3.调用HTML方法实现 因为一直在自己学习没有进入项目,并不知道哪个更常使用. 调用js跳转. <?php //这里是跳转方法 ...

  6. 用HTML/JS/PHP方式实现页面延时跳转

    WEB开发中经常会遇到页面跳转或延时跳转的需求,掌握各种页面跳转方式非常必要. 以下是我总结有用HTML/JS/PHP三类方式实现跳转的方法,例子皆为三秒后跳转到index.php 页面. 1,HTM ...

  7. PHP中header函数的用法及其注意重点是什么呢

    1.使用header函数进行跳转页面: header('Location:'.$url); 其中$url就是将要跳转的url了. 这种用法的注意事项有以下几点: •Location和":&q ...

  8. 专题:php页面跳转方法

    php只有一种方法,利用JavaScript的window.location[和window.location.href效果相同]是一种方法,利用html的meta的Refresh是一种方法. 代码 ...

  9. php header函数要点

    发布:snowfly   来源:网络     [大 中 小] 相信很多人写程序时,使用 header(location) 进行跳转往往不记得写 exit() 语句,这种做法存在严重风险. 从浏览器来看 ...

随机推荐

  1. WPF 用Clip属性实现蒙板特效

    原文:WPF 用Clip属性实现蒙板特效 上一篇,已简单介绍Clip属性的用法,这一篇用它来实现简单蒙板功能,很简单,直接上代码 <Window x:Class="擦除效果.MainW ...

  2. Matlab Tricks(二十二)—— 自定义函数

    printme = @(txt) print('-dpdf', sprintf('figures/Example_%s',txt)); % 这里的 print 显然不是控制台输出一句话,而是图像的命名 ...

  3. XF 列表视图绑定集合

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  4. WPF 自定义范围分组

    <Window x:Class="ViewExam.MainWindow"        xmlns="http://schemas.microsoft.com/w ...

  5. delphi中WebBrowser的parent改变时变成空白问题的解决(覆盖CreateWnd和DestroyWnd)

    这段时间在做一个delphi界面打开网页的功能,且此网页所在窗口可完整显示,可缩小到另一个窗口的panel上显示 可是在改变网页所在窗口时,WebBrowser控件变成了空白 上网google了半天, ...

  6. 微服务架构之「 下一代微服务 Service Mesh 」

    Service Mesh 被大家称为下一代的微服务,是微服务领域的一颗新星,被大家讨论的非常多. 我在大家的讨论中,还看到有人说 “目前的微服务架构我都没学会呢,现在又来一个下一代微服务,真学不动了” ...

  7. Hive-分组之后取前n个

    1. 统计国家每个省份出现次数最高的5个城市的名称 直观思维来考虑: 把 数据组织成: 国家     省份     出现次数(倒序)  城市 row_number() 根据partition by 生 ...

  8. DataTable 更改在有数据列的类型方法

    原文:DataTable 更改在有数据列的类型方法 /// <summary> /// 修改数据表DataTable某一列的类型和记录值(正确步骤:1.克隆表结构,2.修改列类型,3.修改 ...

  9. LCID

    Language Location (or type) Language ID Language tag Supported version Afar   0x1000 aa Release 9 Af ...

  10. mingw(gcc)默认使用的是dwarf格式

    无意中发现的: C:\Users\my>gcc -vUsing built-in specs.COLLECT_GCC=gccCOLLECT_LTO_WRAPPER=C:/Qt/Qt5.6.2/T ...