2011-11-27 108 views
0

在CodeIgniter中测试400错误处理时遇到了一件奇怪的事情。如何正确控制http状态码?

消息:无法修改标题信息 - 头已经发出(输出开始...)

HTTP状态代码始终是200,我终于发现有前新线<?php ...。然后我检查了php文档,发现这个:

header()用于发送一个原始的HTTP头。有关HTTP头的更多信息,请参阅»HTTP/1.1规范。

请记住,必须在发送任何实际输出之前调用header(),或者通过普通的HTML标记,文件中的空行或PHP来发送。

那么如何在PHP中正确设置http状态码以确保它在任何输出之前? 我是php编程新手。谢谢你的回复!

回答

1

正如其他人所说的,您必须在任何其他输出之前发送标题(即使用header())。

可能经常发生的一件事是,有时您会在关闭PHP标记之后包含无意中在其中包含换行符的文件。例如

<?php 
/* 
* This is a file of PHP code 
*/ 


/* 
* file ends here 
*/ 
?> 

__________________________ (actual end of file) 
# unexpected newline above gets sent as output 

为了减少发生这种情况的可能性,您可以故意忽略关闭的PHP标记。该文件将被解析为PHP直到结束,因此从包含文件发送伪造的换行符或空格的可能性要小得多。

根据您的编辑器,您还可以将其设置为显示空格(回车符,空格,制表符),这可以帮助您在尝试消除脚本的意外输出时(例如,Eclipse和Notepad ++都可以这样做) 。

2

那么如何在php中正确设置http状态码以确保它在任何输出之前?

你叫header()你做任何事情,产生输出之前(包括把空白字符以外<?php部分)。

0

请您的header()函数之前,任何事情都返回给访问者。

如果在调用header()之前无法确定返回的内容,请在PHP脚本的开头添加ob_start()函数。

虽然它可以工作,但我仍然建议你清理你的代码,并且不要让数据在它应该输出之前输出。总是知道你自己的代码中发生了什么,而不是回到补丁解决方案是一个更好的做法。

+0

-1使用'ob_start()'作为创可贴,但+1确认使用'ob_start()'作为创可贴是一个坏主意。 – 2011-11-27 18:35:50

+0

@Phoenix,这就是为什么我说我建议用户在可能的情况下清理代码,而不是使用ob_start()方法。无论如何,如果他被迫迅速解决问题,没有时间或无法清理代码,ob_start()将起作用。 我希望你现在就能删除你的倒票。 – 2011-11-27 18:41:33

+0

没有倒下;虚拟-1被虚拟+1取消。 – 2011-11-27 18:46:03