web-dev-qa-db-ja.com

Apacheの「ヘッダーの前のスクリプト出力の終了」エラー

Windows上のApacheでPerlスクリプトにアクセスしようとすると、次のエラーが表示されます。

Server error!

The server encountered an internal error and was unable to complete your request.

Error message: 
End of script output before headers: sample.pl

If you think this is a server error, please contact the webmaster.

Error 500

localhost
Apache/2.4.4 (Win32) OpenSSL/1.0.1e PHP/5.5.3

これは私のサンプルスクリプトです

#!"C:\xampp\Perl\bin\Perl.exe"
print "Hello World";

しかし、ブラウザでは動作しません

18
user3367242

ファイルの許可を確認してください。

間違った権限が設定されたLinuxマシンでもまったく同じエラーが発生しました。

chmod 755 myfile.pl

問題を解決しました。

18
Renning

これがWeb用のCGIスクリプトである場合、ヘッダーを出力する必要があります。

#!"C:\xampp\Perl\bin\Perl.exe"

print "Content-Type: text/html\n\n";
print "Hello World";

次のエラーメッセージは、このEnd of script output before headers: sample.pl

または、さらに良いことに、ヘッダーを出力するには [〜#〜] cgi [〜#〜] モジュールを使用します。

#!"C:\xampp\Perl\bin\Perl.exe"

use strict;
use warnings;

use CGI;

print CGI::header();
print "Hello World";
15
Miller

将来の参考のために:

これは通常、ファイルを表示または実行できないときに発生するエラーであり、その理由は一般にアクセス許可エラーです。 @Renningの提案に従い、chmod 755 test.cgiを実行することから始めます(明らかにtest.cgiをここのcgiスクリプトの名前に置き換えます)。

それでもうまくいかない場合は、他にも試してみることができます。別のユーザーの家でtest.cgiをルートとして作成したときに、このエラーが発生しました。そこで修正されたのは、chmod user:user test.cgiを実行することでした。ここで、userは現在いる自宅のユーザーの名前です。

最後に考えることができるのは、cgiスクリプトが適切なヘッダーを返すようにすることです。私のRubyスクリプトでは、ページに実際に出力する前にputs "Content-type: text/html"を置くことでそれを行いました。

ハッピーコーディング!

7
watzon

おそらくこれはSELinuxブロックです。これを試して:

# setsebool -P httpd_enable_cgi 1
# chcon -R -t httpd_sys_script_exec_t cgi-bin/your_script.cgi
5
kod

Raspberry-piで同じエラーが発生しました。シバンに-wを追加して修正しました

#!/usr/bin/Perl -w
5
Carter Brown

Suexecを使用している場合は、suexecで指定したユーザーと同じユーザーがスクリプトとそのディレクトリを所有していることを確認してください。

さらに、cgiスクリプトを実行しているユーザーに、ファイルおよびShebangで指定されたプログラムに対する実行権限が与えられていることを確認してください。

たとえば、私のcgiスクリプトが

#! /usr/bin/cgirunner

次に、ユーザーは/ usr/bin/cgirunnerを実行する許可を必要とします。

3
Despertar

XAMPP cgiで始めるすべての人にとって

拡張子をplからcgiに変更します
パーミッションを755に変更します

mv test.pl test.cgi
chmod 755 test.cgi

私も修正しました。

2
crustycollins

内部エラーは、シバン行の終わりに隠された文字が原因です!!すなわち、行#!/ usr/bin/Perl

末尾に-または-wを追加すると、文字が「Perl」から離れ、Perlプロセッサへのパスを見つけて実行するスクリプトを許可します。

HIDDEN文字は、スクリプトの作成に使用されたエディターによって作成されます

1
Tony Goertz

Apacheのmod_userdirを使用してホームディレクトリからCGIファイルを実行しており、ユーザーのpublic_htmlディレクトリがそのユーザーのプライマリGIDによってグループ所有されていない場合、このエラーが発生する可能性があります。

私はこれに関するドキュメントを見つけることができませんでしたが、これはいくつかの失敗したCGIスクリプトにつまずいた解決策でした。私はそれが本当に奇妙に聞こえることを知っています(私にとっても意味がありません)が、それは私のために働いたので、うまくいけばこれは他の誰かにも役立つでしょう。

1
jayhendren

上記のすべての提案に基づいて、cgiスクリプトの実行にxamppを使用していました。 Windows 8では変更は一切ありませんでしたが、Cent7.0では上記のようなエラーがスローされていました

AH01215:(2)そのようなファイルまたはディレクトリはありません: '/opt/lampp/cgi-bin/pbsa_config.cgi'のexecが失敗しました:/opt/lampp/cgi-bin/pbsa_config.cgi、リファラー:http:// <> /MCB_HTML/TestBed.html

[2017年8月30日水曜日09:11:03.796584 2017] [cgi:error] [pid 32051] [client XX:60624]ヘッダーの前のスクリプト出力の終わり:pbsa_config.cgi、リファラー: http:// xx/MCB_HTML /TestBed.html

試してください:

無効化されたselinux

スクリプトに対する完全なアクセス許可が与えられますが、755は問題ありません

最後に-wのように追加しました

#!/usr/bin/Perl -w*

use CGI ':standard';
{

        print header(),
         ...
         end_html();


}

**-w** indictes enable all warnings.It started working, No idea why -w here.
0
Bhagyaraj

回答は受け入れられないため、可能な解決策を1つ提供したいと思います。スクリプトがWindowsで作成され、Linuxサーバーにアップロードされた場合([〜#〜] ftp [〜#〜]を介して)、問題は通常レイズします。その理由は、WindowsではCRLFを使用して各行を終了し、LinuxではLFを使用するためです。そのため、次のようにAtomなどのエディターを使用して、CRLFからLFに変換する必要があります- enter image description here

0
Ian