以下のスクリプトを実行すると、「スクリプトヘッダーの早期終了: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 = "[email protected]";
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");
}
?>
私はキックと笑いについての自分の質問に答えることを考えました(そして、いつか同じエラーに遭遇し、答えが見つからないかもしれないすべての人々)。
ファイル許可の問題でした。
私のウェブサイト上のすべてのファイルは、「644」の許可に設定されました。許可レベルを705(chmod 705
[chmod 755
も動作します])すべてがうまくいきました。これは重要ではありませんが、フォルダーを701に変更しました(非表示にしますが、サーバーで実行可能です)。
.644ファイルがおそらく644に設定されたときに、他のサーバーで.PHPファイルが機能した理由がまだわかりません。 Apacheはどのようにして世界の許可なしにスクリプトを実行できますか? Apacheは世界の許可を必要としませんか?まだいくつか質問があります...
「スクリプトヘッダーの早期終了」エラーメッセージは、おそらく最も嫌悪され、よく見られるエラーメッセージです。エラーが実際に意味することは、スクリプトが何らかの理由でWebサーバーに出力を返す前に停止したことです。スクリプトライターの一般的な原因は、出力コードを印刷する前にコンテンツタイプを設定できないことです。たとえば、Perlでは、HTMLを印刷する前に、コンテンツタイプをtext/htmlに設定するようPerlスクリプトに指示する必要があります。これは、次のようにヘッダーを送信することで行われます。
print "Content-type: text/html\n\n";
これはファイルのアクセス許可に関係しており、suphp(通常cpanel/whostサーバー)がインストールされているシステムで発生します。
書き込み許可を削除する phpファイルの所有者(644 | 600)以外のユーザーからこの問題が修正されます。それは私がそれを修正した方法です。
これがお役に立てば幸いです。
行末を確認してください!ファイルが見つからないというエラーが表示された後、Apacheログでこの「premature of end headers」エラーが表示されます-Unixスタイルではなく、Windowsの行末がスクリプトにある可能性があります。私はその問題/解決策に出くわしました。
エラーはさまざまな問題によって発生する可能性があります。詳細については、suexecまたはfcgiログを確認してください。たとえば、suexecに間違ったユーザーと権限がある場合、試行を解決するためにエラーが発生する可能性があります
chgrp WEBGROUP /usr/local/Apache2/bin/suexec
chmod 4750 /usr/local/Apache2/bin/suexec
これを修正するには、ディレクトリ全体のアクセス許可を755に変更する必要があり(777は機能しませんでした)、ディレクトリ全体のファイル所有者を変更しました
chmod -R 755 public_html
chown -R nobody:nobody public_html
私のコンピューターでphpを実行するユーザーは誰もいません。
私の場合、キャッシュディレクトリはそれほど大きくなく、17MBしかありませんでしたが、Webサイトからアクセスするには永遠に時間がかかり、max_execution_timeに達した後にそのエラーが発生していました。
ディレクトリの名前をcache-BKに変更し、同じアクセス許可を持つ新しいキャッシュディレクトリを作成して問題を解決しました。
今日、この問題を経験しましたが、残念ながらここでの提案はどれも役に立ちませんでした。唯一の問題は、エラーが表示されなかったことです。文字通りstrace -p <process_id>
Apacheスレッドで、書き込まれているヘッダーと次の行でクラッシュするApacheを見つけます。 PHPコードのどこかに、12KBを超えるデータを含むヘッダーを設定していました。
ここでの教訓は、ApacheがHTTP error 500 - Premature end of script
- failureは、HTTPヘッダーが長すぎるかオーバーフローしている結果である可能性があります。
ほとんどのWebサーバー(すべてではないにしても)にHTTPヘッダーの制限があるため、これと同じ問題がある場合は、ヘッダーの長さをデバッグします。
PS: この返信 ヘッダーサイズに関する情報があります。
私の場合、私は変えなければなりませんでした
#!/usr/bin/php
に
#!/usr/bin/php-cgi
多くのdiffの後、これはhttpd.conf
問題のサーバー上のファイル:
AddHandler php5-script .php
問題を解決しました。
このスレッドに遅れましたが、99%の時間で正常にロードされるページでこのエラーが断続的に発生します。また、エラーが発生した後にブラウザーを更新すると、ページが正しく読み込まれます。その観点から、私はそれが権限の問題だとは思いませんが、他に何が必要かわからず、私のウェブホストはあまり役に立ちません。
ApacheのデフォルトのLimitRequestFieldSizeとLimitRequestLineの値を増やした後、PHP-FPMとApacheを使用してこの問題にぶつかりました。
私がこれを行った唯一の理由(Apacheは混乱しないと言います)は、Yii2がPOSTリクエストでpjaxの問題を抱えているためです。
ただし、php-fpmは500エラーを大きくしました。
uは、Apache2でホストするときにHTTPヘッダーが必要な適切なコンテンツタイプヘッダーを応答に追加するのを忘れました
つかいます
print "Content-type:text/html\r\n\r\n"
または
header('Content-Type: text/html');
私の場合(PHPプラグインの一番上のフォルダーにあるWordpressファイルを参照)、そのフォルダーのアクセス許可を変更する必要がありました。私のテスト環境は良好でしたが、展開したときにフォルダは775でした。それを755に変更すると、正常に動作します。
上記のすべてを試しましたが、Windowsコンパイラが見つからないことがわかりました。
これをダウンロードしてインストールすると、問題が修正されました。これが問題かどうかを確認するには、コマンドラインからPHPを実行してください。
この問題があり、PHPバージョンを5.3.3から5.6.30に変更することで解決します。