PHP header()使用HTTP 500错误调用“崩溃”脚本

时间:2010-01-20 20:22:12

标签: php http header http-headers

我使用PHP 5.2.9。

要查看/记录错误,在我的脚本开始时我有:

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');
ini_set('log_errors', 'On');
ini_set('error_log', $_SERVER['DOCUMENT_ROOT'] . '/php.log');

但是当我使用接下来两行中的第一行时,我的脚本会发出HTTP 500错误,并且没有显示任何内容(除了500错误)并且我的php.log中没有记录任何内容。如果我使用第二行而不是第一行,则一切正常,304正常发出。

header('Not Modified', true, 304); //Crash php with 500 error
header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified', true, 304); //Works OK
//In both case exit(); is called just after header().

这两行不等同(参见下面的链接)?为什么第一个版本“崩溃”我的脚本?!

这与以下内容有关: Header use in PHP

编辑1:这是我能找到的唯一日志:

'
69.70.84.xx - - [20/Jan/2010:15:54:06 -0600] "GET /framework2/ HTTP/1.1" 200 2968 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"
69.70.84.xx - - [20/Jan/2010:15:54:08 -0600] "GET /foo/bar.js HTTP/1.1" 404 8642 "http://www.mydomain.com/framework2/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"
69.70.84.xx - - [20/Jan/2010:15:54:10 -0600] "GET /framework2/ HTTP/1.1" 500 8511 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"
69.70.84.xx - - [20/Jan/2010:15:54:11 -0600] "GET /framework/mydomain_ajax-dom.js HTTP/1.1" 304 - "http://www.mydomain.com/framework2/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"
69.70.84.xx - - [20/Jan/2010:15:54:11 -0600] "GET /framework/templates/common/Reset.css HTTP/1.1" 304 - "http://www.mydomain.com/framework2/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"
69.70.84.xx - - [20/Jan/2010:15:54:11 -0600] "GET /framework/templates/common/Error.css HTTP/1.1" 304 - "http://www.mydomain.com/framework2/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"
69.70.84.xx - - [20/Jan/2010:15:54:11 -0600] "GET /framework/templates/common/Base.css HTTP/1.1" 304 - "http://www.mydomain.com/framework2/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"
69.70.84.xx - - [20/Jan/2010:15:54:11 -0600] "GET /images/Error-48.png HTTP/1.1" 304 - "http://www.mydomain.com/framework2/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)"
'
  1. 第1行是正确提供的文档。
  2. 第2行是我文档中虚拟.js的404。
  3. 第3行是发生实际错误的地方(我在浏览器中点击了刷新,而我的PHP发出了崩溃我脚本的304标题)。
  4. 第4,5,6,7,8行是由我的自定义错误消息(通过.htaccess)引起的,显示500错误消息。
  5. 编辑2:我联系了网络主机支持,询问我是否可以访问更多日志,他们说没有,但在他们一边,他们可以访问我看不到的日志。我的错误在那里:

    'backend: malformed header from script. Bad header=Not Modified: index.php'
    

    回到我的问题...为什么在某些主机上第一个版本不起作用而在其他主机上它似乎没问题(更糟糕的是,在上面的链接中有人说第二个版本崩溃而第一个版本没问题)? ?

2 个答案:

答案 0 :(得分:3)

不,这些线不相同。第一个会写一个无效的标题行。 documentation to the header function说:

  

header()用于发送原始HTTP标头。

string 参数的描述中:

  

有两种特殊情况的标题调用。第一个是以字符串“HTTP /”开头的标题(大小写不重要),它将用于确定要发送的HTTP状态代码。

在您的情况下,值Not Modified不会以HTTP/开头,因此不会将其设置为HTTP状态代码,而只会设置为常规header field。但它无效,因为它没有以下形式:

message-header = field-name ":" [ field-value ]

这就是错误日志条目所说的内容。 Not Modified不是有效的原始HTTP标头。

第三个参数 http_response_code 只是在设置重定向时设置状态代码,以避免两个header调用,如:

header('HTTP/1.1 301 Moved Permanently');
header('Location: http://example.com');

而不是你可以简单地写:

header('Location: http://example.com', true, 301);

答案 1 :(得分:2)

在这种情况下,您需要检查Web服务器错误日志,而不是PHP错误日志,以获取有关崩溃的更多信息。