php header函数的问题,比如说header之前不能有实际的输出
原文链接:PHP Header用于页面跳转要注意的几个问题总结php技巧脚本之家
搜到了这篇文章,开头就说了三个关于PHP header()的注意事项,
- location和“:”号间不能有空格,否则会出错。
- 在用header前不能有任何的输出。
- header后的PHP代码还会被执行。
第3点测试结果无误。
第1点,测试大概是指的 header('Location: http://segmentfault.com/');
中 Location
和 :
不能有空格吧,但其实是可以有的。
主要是第2点,header前不能有任何的输出有疑问,我测试了下面的代码,能成功跳转啊:
<html>asdf</html> <?php header('Location : http://segmentfault.com/');
到底要怎样测试才能报错呢?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前不能有任何的输出有疑问,我测试了下面的代码,能成功跳转啊:
<html>asdf</html> <?php header('Location : http://segmentfault.com/');
到底要怎样测试才能报错呢?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内容就可以了。以下是不良示范。
<?php for($i = 0; $i < 1e5; $i++) echo $i; header("ABCABC: BCDBCD");
@scaret 应该是对的, 其实就是缓存的问题.
<code><?php echo "<html></html>"; ob_flush(); flush(); header('Location: http://segmentfault.com/'); </code>
得到
<code>Warning: Cannot modify header information - headers already sent by (output started at ... </code>
你把html标签,换成PHP内部的echo,就会报错了。
php脚本中的html标签,其实是等整个PHP执行完,才会发送给用户的。
所以在你demo里面的header('Location : http://segmentfault.com/');
前面,并没有任何输出。
header('Location : http://segmentfault.com/');
这个方法,是在响应头里面,发一个302重定向。而响应头当然要比响应主体要提前输出。
详情可以用fiddler抓包看看
楼主你好,我和你有同样的疑问,我也是在header 200 之前进行了输出,按照二楼的方法,我甚至输出了:
<code>//不要轻易加入以下代码,可能会搞垮你的浏览器,只是为了说明 for($i = 0; $i < 1e100; $i++) echo $i; </code>
超过几十兆的数据,客户端浏览器依然没有报错,我猜测可能是web server端(例如apache或者nginx)已经对这种情况进行了优化,也许header之前不能有输出只是一个古老的建议,可能是因为php老版本存在的bug导致的,现在估计这个bug已经被修正,所以没有把报错。
另外有人说是因为没有马上进行客户端输出,所以我使用下面的代码:
<code>for($i = 0; $i < 1e5; $i++) echo $i; ob_flush(); flush(); header('HTTP/1.1 200 OK'); </code>
依然没有报错,谁能解答呢?
我只能说目前的php已经可以识别头输出,然后将头输出单独取出然后在response的时候优先输出,然后就成功避免了header之前有输出的问题。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는
