web-dev-qa-db-ja.com

Perl Apache:プレーンテキストとして表示されるPerlスクリプト

ApacheおよびPerl cgi scriptsを使用して設定する場合、index.cgi/index.plを実行する代わりにプレーンテキストとして表示される理由がわかりません。ブラウザにhttp://localhostを配置すると、実行する代わりにコードの下に表示されます。

List item
    #!C:/Dwimperl/Perl/bin/Perl.exe -w

     print "Content-type: text/html\n\n";
        print <<HTML;
        <html>
        <head>
        <title>A Perl web page</title>
        </head>
        <body>
        <h3>A hello world form Perl</h3>
        </body>

        HTML
        exit;

これはhttpd.confファイルの一部であり、ほとんどの場合編集しました(さまざまなオンラインリファレンス、チュートリアルを読んだ後)

# This should be changed to whatever you set DocumentRoot to.
<Directory "D:\webserver">

Listen 80
ServerName localhost:80
LoadModule cgi_module modules/mod_cgi.so

# First, we configure the "default" to be a very restrictive set of 
# features.  
<Directory />
    Options FollowSymLinks +ExecCGI
    AllowOverride None
</Directory>

DirectoryIndex index.html index.html.var index.cgi index.pl

AccessFileName .htaccess

# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi .pl

ScriptAlias /cgi-bin/ "C:/Apache/Apache2/cgi-bin/"
16
msinfo

ブラウザがスクリプトのコードを印刷している場合、それはスクリプトを実行するアプリケーションを見つけることができないことを意味します。これを解決するための最初のステップは2行下です。 AddHandlerは、_.cgi_および_.pl_で終わるファイルがcgiスクリプトとして扱われるようにします。また、_+ExecCGI_オプションを使用すると、スクリプトを実行できます。また、スクリプトが正しいPerlバイナリの場所を指していることを確認してください。

_    AddHandler cgi-script .cgi .pl
    Options FollowSymLinks +ExecCGI
_

また、httpd.confにいくつかの間違い/設定ミスがある

  • エイリアス行は、cgiスクリプトが存在するcgi-binディレクトリを指す必要があります。

ScriptAlias/cgi-bin/"D:\ webserver\cgi-bin"

  • 同じcgi-binディレクトリの場合、次の構成は_httpd.conf_にある必要があります。 _<Directory "D:\webserver">_部分を以下に置き換える必要があります。
_<Directory "D:\webserver\cgi-bin" />
    AddHandler cgi-script .cgi .pl
    Options FollowSymLinks +ExecCGI
    AllowOverride None  
</Directory>
_
  • 以下のようなコマンドラインからcgiスクリプトを実行してみてください。最初にコマンドラインから印刷または実行する必要があります。

Perl test.cgi

  • _cgi-bin_ディレクトリとcgiスクリプトへの読み取りと書き込みの再帰的なアクセス許可があることを確認してください。また、書き込み権限を持つディレクトリまたはファイルを作成できます。そうでない場合は、書き込み許可を持つ他の場所に_cgi-bin_ディレクトリを作成し、代わりに_httpd.conf_のaliasおよびdirectory属性にそのパスを指定します。
  • Apache confの問題が発生するたびに、Apacheエラーログで正確なエラーメッセージを確認してください。それはあなたに問題への良い洞察を与えます。

また、 このリンク が役立ちます。

元の回答者によるものではなく、追加のコメントcgiモジュールを有効にする必要があるかもしれません。私にとっては、cgiをApache 2の新規インストールは_Sudo a2enmod cgi_でした。それを行う前は、Webサイトでスクリプトの内容が表示されていました。)

_Sudo a2enmod cgi_

29
user966588

apacheの新しいバージョンを変更します:オプション+ FollowSymLinks + ExecCGI

2
no7dw

ディレクトリ/場所/ファイルには、適切なハンドラが関連付けられていないか、ExecCGIオプションが有効になっていません。 Apacheチュートリアル:CGIを使用した動的コンテンツ を参照してください。

2
ikegami

mac OS x 10.8で

私はこれをしなければなりませんでした

<Directory />
    Options FollowSymLinks +ExecCGI
    AllowOverride None
</Directory>

そして

これのコメントを外します

#AddHandler cgi-script .cgi .pl
1
joshua paul

ブラウザがスクリプトのコードを印刷している場合、それはスクリプトを実行するアプリケーションを見つけることができないことを意味します。

Apache 2.4(OSX Yosemite、10.10.5)を使用して、間違ったパスでシェバン行を使用すると、ブラウザーに次のように表示されます。

内部サーバーエラー

しかし、有効なShebangラインを使用しても、受け入れられた回答のアドバイスに従うことでcgiプログラムを実行できませんでした。Apacheはプログラムのテキストをブラウザーに提供しました。いくつかの実験の後、/usr/local/Apache2/conf/httpd.confファイルに加える必要がある変更は、行のコメントを外すことだけであることがわかりました。

LoadModule cgid_module modules/mod_cgid.so

私のcgiプログラムの拡張子は.pl、.py、および.rbで、プログラミングしている言語に応じて(およびApache cgi-binディレクトリには拡張子のないテストcgiスクリプトが含まれます)、すべて指定せずに実行されますhttpd.confファイルの任意の場所にある有効な拡張子。デフォルトのhttpd.confファイルには、次の関連行のみがあります。

<IfModule alias_module>
    #Lots of comments here

    ScriptAlias /cgi-bin/ "/usr/local/Apache2/cgi-bin/"

</IfModule>
...
...
<Directory "/usr/local/Apache2/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

私が使用しているシバンの行は、私のcgiプログラムが書かれている言語に依存します:

#!/usr/bin/env Perl

または:

#!/usr/bin/env python 

または:

#!/usr/bin/env Ruby

Cgiプログラムも実行可能ファイルである必要があります。そうでない場合、Internal Serverエラーが発生します。

$ chmod a+x myprog.pl

a+x => all +実行可能ファイル。言い換えれば、所有者、グループ、その他のそれぞれに実行権限を追加します。

また、少なくともcgiプログラムは、応答の本文を出力する前にContent-Type headerを生成する必要があります。

print "Content-Type: text/html\n\n";
print "<h1>Hello, World.</h1>";

(ちなみに、その正確なコードはPerl、python、またはRubyで動作します。)そうでない場合は、Internal Serverエラーが再度発生します。

Cgiスクリプトを実行するURL:

http://localhost:8080/cgi-bin/myprog.pl

これは私がApacheをインストールする方法です:

~/Downloads$ tar xvfz httpd-2.4.18.tar.bz2
...
...
~/Downloads$ cd httpd-2.4.18
...
...
~/Downloads/httpd-2.4.18$ ./configure --help
...
...
--enable-so       DSO capability. This module will be automatically
                  enabled unless you build all modules statically.
...
...

私は一体何が意味するのか分かりませんでしたが、 php docs はそのオプションでApacheをインストールするように言っていたので、先に進んでこれを行いました:

~/Downloads/httpd-2.4.18$ ./configure --enable-so
...
...
~/Downloads/httpd-2.4.18$ make
...
...
~/Downloads/httpd-2.4.18$ Sudo make install

Apache DSOドキュメント ここ

1
7stud
 # use types www.site.com/visible-in-url
 # Apache serves /var/path/to/dir
 ScriptAlias /visible-in-url/ /var/path/to/dir/

 # Note the order of the aliases matters - first cgi than static content
 # Note this dir is a symlink pointing to the desirable directory
 <Directory "/var/path/to/dir">
    AddHandler cgi-script .cgi .pl
    AllowOverride Indexes
    Options +ExecCGI +MultiViews +SymLinksIfOwnerMatch
    Require all granted
 </Directory>

 <Files ~ "\.(pl|cgi)$">
    SetHandler Perl-script
    PerlResponseHandler ModPerl::PerlRun
    Options +ExecCGI +SymLinksIfOwnerMatch
    PerlSendHeader On
 </Files>
1
Yordan Georgiev