我们都知道,PHP里可以通过header("Location: http://www.foobar.com/"),告知客户端浏览器跳转到新地址。在很多框架里都有redirect的实现,大多最后都是调用的这里。

今天在调试ZF2的时候遇到一个奇怪的问题,就是不管怎么调用redirect,页面都输出空白,既不跳转到目标页面,也不报错。

后来定位了半天,发现一个小线索——页面输出了一个空白的换行!(这个不细心还真的看不出来啊!)但是我程序从头到尾,都没有任何一个地方有输出啊?没办法,只能从框架的入口开始,一个文件一个文件的过。最后终于抓出那个输出空白行的文件了。

尼玛,原来是我手贱,在其中一个文件里加上了一个PHP脚本结束符?>,更手贱的是在这个结束符后面还加了一个空白的换行。

问题就出来了!作为网页脚本语言,PHP默认和HTML是保持了一定的 兼容性 (我们姑且这么说吧),简单的说,凡事不是<?php?>标签之间的内容,PHP解释器都会当做原始的HTML输出。所以才会导致空白换行符的输出。

而了解PHP的人应该都知道,header函数必须在没有任何输出的情况下,才能生效(如果有输出,就会默认先输出一个header,后续的header是不能覆盖掉的)。

现在终于知道为什么那么多人写PHP的时候,都不加?>结束符了。尼玛坑爹啊!