【问题标题】:Error 500: Premature end of script headers错误 500:脚本头过早结束
【发布时间】:2013-07-09 03:10:47
【问题描述】:

我在运行以下脚本时收到“脚本头过早结束:contactform.cgi”错误消息。令我沮丧的是,我在另一台服务器上将其作为 .php 运行,并且它有效。但是,我不得不更改服务器,它们只支持 CGI PHP。但是,它不起作用。我认为代码没有错,但以防万一。

我已经阅读过,有些人说这是权限问题。对我来说会是这样吗?

我知道 "display_errors" 和 "error_reporting" 语句会在错误日志中显示错误,但是如果我无权访问服务器,如何查看日志?

#!/usr/local/bin/php

<?php

print "Content-type: text/html\n\n";
use CGI::Carp qw(fatalsToBrowser);
ini_set('display_errors',1);
error_reporting(E_ALL);

if(isset($_POST['email'])) {

//Email this form to me
$email_to = "myemail@site.com";

function died($error) {
    // your error code can go here
    echo "Oops... something's wrong. ";
    echo "Fix the error(s) below:<br /><br />";
    echo $error."<br /><br />";
    die();
}


// validation expected data exists
if(!isset($_POST['first_name']) ||
    !isset($_POST['last_name']) ||
    !isset($_POST['email']) ||
    !isset($_POST['subject']) ||
    !isset($_POST['comments'])) {
    died('There appears to be a problem with the form you submitted.');       
}


$first_name = $_POST['first_name']; // required
$last_name = $_POST['last_name']; // required
$email_from = $_POST['email']; // required
$subject = $_POST['subject']; // not required
$comments = $_POST['comments']; // required

$error_message = "";
$email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
if(!preg_match($email_exp,$email_from)) {
$error_message .= 'The Email Address you entered does not appear to be valid.<br />';
}
$string_exp = "/^[A-Za-z .'-]+$/";
if(!preg_match($string_exp,$first_name)) {
$error_message .= 'The First Name you entered does not appear to be valid.<br />';
}
if(!preg_match($string_exp,$last_name)) {
$error_message .= 'The Last Name you entered does not appear to be valid.<br />';
}
if(strlen($comments) < 2) {
$error_message .= 'The Comments you entered do not appear to be valid.<br />';
}
if(strlen($error_message) > 0) {
died($error_message);
}


$email_message = "Form details below.\n\n";

function clean_string($string) {
  $bad = array("content-type","bcc:","to:","cc:","href");
  return str_replace($bad,"",$string);
}

$email_message .= "First Name: ".clean_string($first_name)."\n";
$email_message .= "Last Name: ".clean_string($last_name)."\n";
$email_message .= "Email: ".clean_string($email_from)."\n";
$email_message .= "Subject: ".clean_string($subject)."\n";
$email_message .= "Comments: ".clean_string($comments)."\n";

//Email Subject (put here to include subject from form)
$email_subject = "SUBJECT | ".clean_string($subject)."";


// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);
?>

<!-- include your own success html here -->

<?php
header("Location: thankyou.html");
}
?>

【问题讨论】:

  • 你必须用cgi手动输出标题?尝试打印 "Content-type: text/html\r\n\r\n";
  • 您的打印语句与我在脚本第 5 行使用的打印语句不同吗?
  • use CGI::Carp qw(fatalsToBrowser); -- 那不是 Perl,不是 PHP?
  • 哎呀,我认为你是对的。删除它。
  • 我尝试了以上所有方法,但发现它缺少 Windows 编译器。下载并安装它解决了这个问题。要查看这是否是您的问题,请尝试从命令行运行 PHP。 stackoverflow.com/questions/21397073

标签: php cgi


【解决方案1】:

这是文件权限问题。

我网站上的所有文件都设置为“644”权限级别。一旦我将权限级别更改为 705 (chmod 705),一切正常。请注意,我将其更改为 705,但 755 也可以。我还将它所在的文件夹更改为 701(隐藏它,但仍然可以由服务器执行)。

旁白:我仍然不明白为什么我的 .PHP 文件在可能设置为 644 的情况下可以在另一台服务器上运行? Apache如何在没有世界许可的情况下执行脚本? Apache不需要世界许可吗?我还有几个问题...

【讨论】:

  • 我在这里推测,但您的主机(至少在某一时刻)可能使用了phpsuexec,它以 you 身份运行。来自 bluehost 的帮助文档:“使用 phpsuexec,php 在服务器上以您自己的用户名运行。这消除了使文件和文件夹世界可写的必要性。相反,您可以只对文件夹使用 755(默认值),对文件使用 644 "
  • 我用711作为目录,它的内容成功了。
  • 这对我有用。但是,我必须确保仅对“文件夹”而不是文件进行了 755 更改(顺便说一句……使用 Filezilla 时发生的错误)。
【解决方案2】:

“脚本头过早结束”错误消息可能是您会发现的最讨厌和最常见的错误消息。 错误的实际含义是脚本在将任何输出返回到 Web 服务器之前由于某种原因停止了。 脚本编写者的一个常见原因是在打印输出代码之前未能设置内容类型。例如,在 Perl 中,在打印任何 HTML 之前,有必要告诉 Perl 脚本将内容类型设置为 text/html,这是通过发送标头来完成的,如下所示:

print "Content-type: text/html\n\n";

(来源;http://htmlfixit.com/cgi-tutes/tutorial_Common_Web_dev_error_messages_and_what_they_mean.php#premature

【讨论】:

  • 我在脚本的第 5 行执行此操作。我应该把它放在别的地方吗?
  • 这是php标签下的第一条语句,所以看起来它已经在正确的位置,对吧?
  • 然后,尝试删除第2行的空格行。Apache error.log中有什么东西吗?
  • 刚刚删除了空间。没用。我没有直接访问服务器的权限,因此无法检查错误日志。除了直接访问还有其他的查看日志的方法吗??
  • 摆脱&lt;?php之前的一切。 PHP 不需要 #! 行,那是另一种 perl 主义。
【解决方案3】:

我今天遇到了这个问题,但不幸的是,这里的建议都没有帮助。唯一的问题是我没有看到任何错误。我确实必须在 Apache 线程上执行strace -p &lt;process_id&gt; 才能发现正在写入的标头并且 Apache 在下一行崩溃;在我的 PHP 代码的某个地方,我设置了一个包含超过 12KB 数据的标头。

这里的教训是,在某些情况下,Apache 因HTTP error 500 - Premature end of script-failure 崩溃可能是由于 HTTP 标头过长或溢出造成的。

如果您遇到同样的问题,请调试您的标头长度,因为大多数(如果不是全部)Web 服务器都有 HTTP 标头限制。

PS:This reply 有一些关于标头大小的信息。

【讨论】:

  • 感谢您的回答。这是我在我们的 laravel 应用程序中遇到的问题。有一个错误导致我们的一个自定义标头在某些情况下输出太多内容
【解决方案4】:

检查你的行尾!如果您在 Apache 日志中看到有关未找到文件的错误,然后出现此“结束标头过早”错误 - 可能是您的脚本中有 Windows 行结尾而不是 Unix 样式。我遇到了那个问题/解决方案。

【讨论】:

    【解决方案5】:

    这与文件权限有关,它发生在安装了 suphp(通常是 cpanel/whost 服务器)的系统上。

    删除除 php 文件的所有者 (644|600) 之外的任何其他人的写入权限 将解决此问题。我就是这样解决的。

    我希望这会有所帮助。

    【讨论】:

    • 我在错误上方看到Directory "/data/www/USER/public_html" is writeable by group - 这正是正确的修复方法 - public_html 目录上的chmod 750
    【解决方案6】:

    在我的情况下,它是一个不是很大的缓存目录,只有 17MB,但由于文件结构的原因,网站需要永远访问它,并且在达到 max_execution_time 后产生该错误。

    我将目录重命名为 cache-BK 并创建了一个具有相同权限的新缓存目录,从而解决了问题。

    【讨论】:

      【解决方案7】:

      为了解决这个问题,我不得不将整个目录的权限更改为 755(777 对我不起作用),并更改了整个目录的文件所有者

      chmod -R 755 public_html
      chown -R nobody:nobody public_html
      

      没有人是在我的电脑上运行 php 的用户。

      【讨论】:

        【解决方案8】:

        错误可能由各种问题引起。有关更多信息,请查看 suexec 或 fcgi 日志。 例如,如果 suexec 有错误的用户和权限,它可能会导致错误发生 解决试试

        chgrp WEBGROUP /usr/local/apache2/bin/suexec
        chmod 4750 /usr/local/apache2/bin/suexec
        

        【讨论】:

          【解决方案9】:

          就我而言,我必须改变

          #!/usr/bin/php
          

          #!/usr/bin/php-cgi
          

          【讨论】:

            【解决方案10】:

            你忘记在响应中添加正确的内容类型标头,这是在 apache2 上托管时必须具有的 http 标头

            使用

            print "Content-type:text/html\r\n\r\n"
            

            header('Content-Type: text/html');
            

            【讨论】:

              【解决方案11】:

              就我而言(引用 Wordpress 插件顶部文件夹中的 PHP 文件),我必须更改该文件夹的权限。我的测试环境很好,但部署时文件夹有 775。我将其更改为 755,它工作正常。

              【讨论】:

                【解决方案12】:

                经过多次差异,这是相关服务器上 httpd.conf 文件中缺少的内容:

                AddHandler php5-script .php
                

                解决了这个问题。

                【讨论】:

                • 警告:这似乎是一个小众的 Apache 配置,可能在 Ubuntu 下也是如此。我从未见过使用或需要此指令。
                • 它是旧版本的 apache(2.2.22)/php(5.3.8)/openssl,它是从 Red Hat Enterprise Linux Server 5.5 版上的源代码压缩包编译的
                • 我这样认为,你只是在玩mod_php?
                • 当您无法通过包管理器获得当前版本时,在旧系统上链接/编译。在那段时间里,我在每台服务器上编译了 apache/php/openssl/zlib。不再需要这样做了,因为有很多发行版都跟得上。
                猜你喜欢
                • 2017-07-22
                • 2012-06-09
                • 2011-05-19
                • 1970-01-01
                • 2015-11-30
                • 2012-12-03
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多