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() 语句,这种做法存在严重风险. 从浏览器来看 ...
随机推荐
- WPF Timeline简易时间轴控件的实现
原文:WPF Timeline简易时间轴控件的实现 效果图: 由于整个控件是实现之后才写的教程,因此这里记录的代码是最终实现后的,前后会引用到其他的一些依赖属性或者代码,需要阅读整篇文章. 1.确定T ...
- html5中 table数据导出到excel文件
JS代码: /** * table数据导出到excel * 形参 table : tableId ; * sheetName : 工作薄名 * fileName : 文件名 * linkId :隐藏的 ...
- 潜移默化学会WPF--值转换器
原文:潜移默化学会WPF--值转换器 1. binding 后面的stringFormat的写法----连接字符串 <TextBlock Text="{Binding Path=Qty ...
- TASM 5.0 安装及使用教程
安装TASM 5.0很简单,您只需要下载本站[相关工具]中的"TASM50.zip"文件,解压后在Windows9x/NT下执行"INSTALL.EXE"即可开 ...
- web appbuilder 正式版用yo esri-appbuilder-js:widget生成widget读取不到config解决方案
对于在webappBuilder正式版中,如果用yo esri-appbuilder-js:widget生成的widget,在写widget的时候widget里面的config.json ...
- 中国2017 Google 开发者大会第二天简单回顾
昨天早晨发布了第一天的开发者大会回顾文章后,就匆匆忙忙赶去会场继续享受高科技的盛宴,接下来简单回顾一下第二天的大会参与情况. 昨天早晨下着小雨,并带着微风,在外面还是挺冷的,这里不得不给工作人员点个赞 ...
- SharePoint js操作原生的New/Edit表单
列表的表单,有个类似的需求:在New需隐藏特定字段,Edit时显示. 默认是New/Edit表单的字段是一样,就算在Content type 是隐藏也是同时影响两个表单. 如何做到仅仅在New时隐 ...
- Linux运维工程师成长路线及应实现的目标
作为一名运维工程师,需要学习的东西非常多,在学习的过程中也没有任何捷径可言,必须一步一个脚印地学习.积累才能把个人技能提升到相应的高度.根据目前流行的发行版及国际流行的Linux认证,红帽认证和LPI ...
- qt中用tcp传输xml消息 good
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上传输xml消息. 协议格式如 ...
- Verilog写一个对数计算模块Log2(x)
网上一个能用的也没有,自己写一个把. 1.计算原理: 整数部分 网上找到了一个c语言的计算方法如下: int flog2(float x) { return ((unsigned&)x> ...