header 无法实现跳转
特别注意:(我就是看了这个才解决问题的)
如果使用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()函数之前,有输出内容了,比如:
- < ?PHP
- echo "hello";
- header("content-type:
text/html;charset:utf-8"); - ?>
上面的代码就会出现警告!
为什么在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的输出缓冲 下面我们就可以做任何操作了
- < ?PHP
- ob_start();
- echo "dfdfd";
- //注意不能卸载ob_start() 前面
- header("content-type:text/
html;charset=utf-8"); - setcookie();
- ?>
如果要开始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_
- < ?PHP
- ob_start();
- print "Here's a pretty dumb way
to calculate the length of a string."; - $length = strlen(ob_get_content());
- ob_end_clean();
- ?>
这个PHP无法修改header信息例子显示了一个效率很低的确定字符串长度的方法。它不是简单的使用strlen()函数处理,而是先启用 output buffering 机制,将字符串打印出来,然后再确定output buffer的长度。最后清除output buffer(并没有发送),然后禁用output buffering机制。
header 无法实现跳转的更多相关文章
- php下载远程图片方法总结(curl手动解析header)curl跳转问题解决
常用方法一般有:. file_get_contents file_put_contents readfile($file) //效率很高. 一般代码: /** * 抓取远程图片 * * @param ...
- ThinkPHP中header()无法发生跳转的解决办法
一定要在header('Location:url')后加上exit()/die()才可以,特此记录.
- location跳转和header跳转的区别
1:header("location:url") 跳转之前不能有任何输出,如果想在header之前有输出,则要修改php.ini文件.具体 output_handler =mb_o ...
- 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 ...
- PHP页面跳转(PHP笔记)
目前学习到三种方法: 1.调用js跳转 2.header()跳转 3.调用HTML方法实现 因为一直在自己学习没有进入项目,并不知道哪个更常使用. 调用js跳转. <?php //这里是跳转方法 ...
- 用HTML/JS/PHP方式实现页面延时跳转
WEB开发中经常会遇到页面跳转或延时跳转的需求,掌握各种页面跳转方式非常必要. 以下是我总结有用HTML/JS/PHP三类方式实现跳转的方法,例子皆为三秒后跳转到index.php 页面. 1,HTM ...
- PHP中header函数的用法及其注意重点是什么呢
1.使用header函数进行跳转页面: header('Location:'.$url); 其中$url就是将要跳转的url了. 这种用法的注意事项有以下几点: •Location和":&q ...
- 专题:php页面跳转方法
php只有一种方法,利用JavaScript的window.location[和window.location.href效果相同]是一种方法,利用html的meta的Refresh是一种方法. 代码 ...
- php header函数要点
发布:snowfly 来源:网络 [大 中 小] 相信很多人写程序时,使用 header(location) 进行跳转往往不记得写 exit() 语句,这种做法存在严重风险. 从浏览器来看 ...
随机推荐
- js仿黑客帝国文字数字雨效果
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- sdut 5-1 继承和派生
5-1 继承与派生 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握继承与派生的概念.派生类的定义和用法.当中派生类构造函数的定义 ...
- cocos2d-x 显示触摸操作(单击显示效果浪潮,对于视频演示)-绩效转型
http://blog.csdn.net/hitwhylz/article/details/26042751 首先是显示触摸操作. 在文章最后.对性能进行一些提升改造. 由于要演示我们的作品.使用试玩 ...
- Angular自定义表单验证
前端表单验证 为年龄输入框添加了两个验证,并分情况填写了提示语 <form nz-form [formGroup]="validateForm"> <nz-for ...
- Visifire charts ToolBar
<charts:Chart x:Name="ChartPat" Theme="Theme2" BorderBrush="Gray" P ...
- WPF查找父元素子元素
原文:WPF查找父元素子元素 /// <summary> /// WPF中查找元素的父元素 /// </summary> /// &l ...
- EF context.SaveChanges()特点
EF context.SaveChanges()特点 1 一次连接保存多条数据(工作单元模式): 2 内部通过事务来执行,如果一条数据保存失败,执行回滚操作: 3 延时加载 var userList= ...
- WPF,通过修改dataGrid的cell的style,改变选中行失去焦点时的颜色 4.0可用
<Style TargetType="{x:Type DataGridCell}"> <Style.Triggers> <Trigger Proper ...
- 【shell】gerrit同步备份脚本的实现
本期分享下gerrit如何实现备份,由于之前的一台代码服务器直接down掉,所以为了以防万一,开始备份gerrit数据,有人说,gerrit不过是个审查代码的工具,备份这个做什么,git是分布式代码管 ...
- 同城快递公司Postmates近日完成1亿美元融资,美国外卖餐饮迎来一波融资热潮
美国外卖市场尚未出现一家独大的巨头,一部分原因是与中国的外卖平台相比,在美国,外卖平台要克服的难题可能更多. 4个月之前才完成3亿美元融资的美国同城快递公司Postmates近日又完成1亿美元融资,估 ...