托管环境之间不一致的HTTP重定向行为


Inconsistent HTTP redirect behavior between hosting environments

这是我几天前问过的一个问题的后续问题,最终我自己解决了。虽然我很高兴发现了潜在的问题,但这个问题只在三种环境中的一种环境中表现出来,这一事实似乎真的很奇怪。

该问题与CakePHP 2.3.0站点上的操作有关,该操作在控制器($this->redirect(...);)中重定向。

基本上,重定向在我的本地(Mac OS X/10.6.8, Apache/2.2.17, PHP/5.3.4)开发机器以及我的同事(Windows 7, Apache/2.4.2, PHP/5.4.3)上工作得很好。"add"操作将记录插入数据库,然后重定向到"index"操作。用户登录工作正常。没有问题,一切看起来都很正常。

然而,在我们的暂放服务器(Debian GNU/Linux 6.0.6内核3.2.6,Apache/2.2.22, PHP/5.3.15)上,任何试图重定向的控制器动作都会导致HTTP 200空白页(而不是预期的HTTP 302重定向)。

页面不是真正的空白,有一个单独的换行符,我最终发现它是在我的一个控制器的PHP开始标记之前错误地添加的。根据我的理解,换行实际上触发了报头输出的结束,因此无法写入Location: ...报头。

一旦发现错误的换行符,这是一个快速修复,但我不知道为什么我没有看到相同的空白页行为在我的Mac或我同事的Windows机器。我不确定这是否是PHP或Apache版本之间的怪癖,或者什么,真的。我对任何人关于事物为何如此运行的理论都很感兴趣。

根据这个堆栈溢出问题的答案:"如何修复"Headers已经发送"PHP出错":

但是它在另一个服务器上工作!?

如果你之前没有得到报头警告,那么php.ini设置已经改变了。然后在另一个上启用输出缓冲服务器,但不是在当前。