代码之家  ›  专栏  ›  技术社区  ›  AlexV

php header()调用“crashing”脚本,HTTP 500错误[重复]

  •  1
  • AlexV  · 技术社区  · 15 年前

    我使用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');
    

    但是当我使用接下来两行中的第一行时,脚本会发出一个HTP500错误,并且不会显示任何内容(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. 第一行是正确送达的文件。
    2. 第2行是我文档中一个dummy.js的404。
    3. 第3行是实际错误发生的地方(我在浏览器中点击了refresh,我的php发出了304头,导致脚本崩溃)。
    4. 第4、5、6、7、8行是由显示500错误消息的自定义错误消息(via.htaccess)引起的。

    编辑2: 我联系了网络主机支持人员,询问我是否有权访问更多的日志,他们拒绝了,但在他们这边,他们有权访问我看不到的日志。我的错误在那里:

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

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

    2 回复  |  直到 15 年前
        1
  •  3
  •   Gumbo    15 年前

    不,这些行不是等价的。第一个将写入无效的标题行。这个 documentation to the header function 说:

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

    在描述中 一串 参数:

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

    在你的案例中,价值 Not Modified 不是从 HTTP/ 因此,不处理设置HTTP状态代码,而只处理常规的 header field . 但它是无效的,因为它没有以下形式:

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

    这就是错误日志条目的状态。 未修改 不是有效的原始HTTP头。

    第三个参数 HTTP响应代码 只是在设置重定向时设置状态代码以避免两个 页眉 像:

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

    你可以简单地写:

    header('Location: http://example.com', true, 301);
    
        2
  •  2
  •   loginx    15 年前

    您将要检查Web服务器错误日志,而不是本例中的PHP错误日志,以获取有关崩溃的更多信息。