您好,欢迎访问一九零五行业门户网

php header函数的问题,比如说header之前不能有实际的输出

原文链接:php header用于页面跳转要注意的几个问题总结php技巧脚本之家
搜到了这篇文章,开头就说了三个关于php header()的注意事项,
location和“:”号间不能有空格,否则会出错。在用header前不能有任何的输出。header后的php代码还会被执行。第3点测试结果无误。
第1点,测试大概是指的 header('location: http://segmentfault.com/'); 中 location 和 : 不能有空格吧,但其实是可以有的。
主要是第2点,header前不能有任何的输出有疑问,我测试了下面的代码,能成功跳转啊:
asdf
到底要怎样测试才能报错呢?php手册上的“remember that header() must be called before any actual output is sent, either by normal html tags, blank lines in a file, or from php”到底是啥意思?
回复内容: 原文链接:php header用于页面跳转要注意的几个问题总结php技巧脚本之家
搜到了这篇文章,开头就说了三个关于php header()的注意事项,
location和“:”号间不能有空格,否则会出错。在用header前不能有任何的输出。header后的php代码还会被执行。第3点测试结果无误。
第1点,测试大概是指的 header('location: http://segmentfault.com/'); 中 location 和 : 不能有空格吧,但其实是可以有的。
主要是第2点,header前不能有任何的输出有疑问,我测试了下面的代码,能成功跳转啊:
asdf
到底要怎样测试才能报错呢?php手册上的“remember that header() must be called before any actual output is sent, either by normal html tags, blank lines in a file, or from php”到底是啥意思?
header函数内的string原则上会被直接加到http头里面去。所以说,如果发送
location : http://with.blank.com
这种并不符合http规范的http头,很可能整个http response都无法解析。
幸运的是,php貌似为你修复了这个http头格式问题。
关于http头先发的问题,的确不应该在http内容输出之后输出http头。但是服务器会缓存输出,虽然你使用了echo或者print,但在那个时刻服务器还没有将这些内容作为http报文输出,这个时候你仍然有机会修改http头。
如果你只是单纯想要引发一个错误的话,很简单,在header()之前输出一个绝对超过缓存大小的http内容就可以了。以下是不良示范。
@scaret 应该是对的, 其实就是缓存的问题.
;ob_flush();flush();header('location: http://segmentfault.com/');
得到
warning: cannot modify header information - headers already sent by (output started at ...
你把html标签,换成php内部的echo,就会报错了。
php脚本中的html标签,其实是等整个php执行完,才会发送给用户的。
所以在你demo里面的header('location : http://segmentfault.com/');前面,并没有任何输出。
header('location : http://segmentfault.com/');这个方法,是在响应头里面,发一个302重定向。而响应头当然要比响应主体要提前输出。
详情可以用fiddler抓包看看
楼主你好,我和你有同样的疑问,我也是在header 200 之前进行了输出,按照二楼的方法,我甚至输出了:
//不要轻易加入以下代码,可能会搞垮你的浏览器,只是为了说明for($i = 0; $i
超过几十兆的数据,客户端浏览器依然没有报错,我猜测可能是web server端(例如apache或者nginx)已经对这种情况进行了优化,也许header之前不能有输出只是一个古老的建议,可能是因为php老版本存在的bug导致的,现在估计这个bug已经被修正,所以没有把报错。
另外有人说是因为没有马上进行客户端输出,所以我使用下面的代码:
for($i = 0; $i
依然没有报错,谁能解答呢?
我只能说目前的php已经可以识别头输出,然后将头输出单独取出然后在response的时候优先输出,然后就成功避免了header之前有输出的问题。
其它类似信息

推荐信息