0

我在 CodeIgniter 中测试 400 错误处理时遇到了一件奇怪的事情。

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

而且http状态码一直是200,最后发现前面多了一行<?php ...。然后我检查了 php 文档,发现了这个:

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

请记住,必须在发送任何实际输出之前调用 header(),无论是通过普通 HTML 标记、文件中的空白行还是从 PHP 发送。

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

4

3 回答 3

2

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

header()在执行任何创建输出的操作(包括将空白字符放在<?php部分之外)之前调用。

于 2011-11-27T16:24:09.703 回答
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++ 都可以做到)。

于 2011-11-27T16:47:20.137 回答
0

header()在将任何内容返回给访问者之前,请您的功能。

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

虽然它会起作用,但我仍然建议你清理你的代码,并且不要让数据在它应该输出之前被输出。更好的做法是始终了解您自己的代码中发生了什么,而不是退回到补丁解决方案。

于 2011-11-27T16:26:12.047 回答