ブラウザでの動作確認

確認方法

テキストエディタで、

#!c:/perl/bin/perl
use strict;
use warnings;

print "Content-Type: text/plain\n\n";
print "Hello, World.";

のように入力します。

1行目で、ActivePerlをインストールしたディレクトリにあるperl.exeを指定しています。2行目と3行目では、バグを発見しやすいようにコードの制約を厳しくしています。そして5行目では出力するデータの種類を、MIME typeで指定しています。

このファイルを、ここではC:/localhost/cgi-bin/sample.cgiに保存するものとします。そしてブラウザでhttp://localhost/cgi-bin/sample.cgiにアクセスします。

ブラウザ上に「Hello, World.」と表示されれば成功です。この実行例はsample.cgiで確認できます。

Content-Typeヘッダ

ブラウザに出力するとき、Content-Typeヘッダの出力を先に行わないと「Error message: malformed header from script. Bad header=Hello, World.: sample.cgi」のようにエラーとなります。Perl CGI : Error message: <br />malformed header from script. Bad header=&lt;body&gt;: - Stack Overflow

トラブル対処法

ブラウザにプログラム コードが表示される

ブラウザにプログラムのコードがそのまま表示される場合には、設定ファイル

AddHandler cgi-script .cgi .pl

として、.cgiおよび.plの拡張子を持つファイルがCGIプログラムとみなされるように設定します。

403 Forbiddenが返される

レスポンスで403が返される場合には、CGIの実行が許可されていません。設定ファイル

<Directory C:/localhost/cgi-bin/>
    Options +ExecCGI
</Directory>

の記述を追記して、特定のディレクトリ (ここではC:/localhost/cgi-bin/) 配下でCGIスクリプトの実行を許可します。また同時に、ScriptAliasディレクティブによるマッピングを確認します。たとえば

ScriptAlias /cgi-bin/ "C:/localhost/cgi-bin/"
ScriptAlias ディレクティブ - mod_alias - Apache HTTP サーバ バージョン 2.2

となっているならば、/cgi-bin/へのアクセスがC:/localhost/cgi-bin/へマッピングされます。スクリプトディレクトリのマッピング - ApacheによるWebサーバ構築(6):仮想ディレクトリとマッピングの設定 - @IT 一志達也 (2001/06/23)

500 Internal Server Errorが返される

レスポンスで500が返される場合には、

  • プログラムに、バグがある。
  • 実行ファイルに、適切なパーミッションが設定されていない。
  • 実行ファイルに、適切な文字エンコーディングが用いられていない。

のような原因が考えられます。

バグが原因ならば、それを修正します。パーミッションは「700」のように、オーナーに実行権限が与えられている必要があります。また文字エンコーディングがUTF-8ならば、BOMなしのUTF-8に変更してみます。改行文字がCRLFとなっているならば、LFに変更します。Windowsはいずれも受け入れますが、Unix上ではエラーとなります。

Error message: malformed header from script.」のようにエラーが表示されるならば、それはContent-Typeヘッダを出力していないためです。この場合にはそれを出力するだけで解決できます。

ブラウザのエラーメッセージでは原因を特定できない場合には、コマンドラインから実行します。perl Filenameとして実行すると、詳細なエラーメッセージを確認できます。またはサーバのエラーログで確認しても同じです。

バグの原因が判然としないならば、デバッガで原因を探ります。

perl.exeのパス

perl.exeのパスが適切に設定されていない場合にも、500エラーが発生します。Windows版ではPerlのパスを、

#!c:/perl/bin/perl

のように記述しますが、UNIX版では

#!/usr/bin/perl

のようにします。WindowsからUNIX形式に対応させる簡単な方法は、シンボリック リンクを使用することです。コマンドラインから、

mklink /d c:\usr c:\perl

としてシンボリック リンクを作成すると、/usr/bin/perlへのアクセスでc:/perl/bin/perlが参照されるようになります。Win32版ApacheでMT環境を構築するときの注意点 (エムロジック放課後プロジェクト)

もしくはUNIX形式のパスに合わせて、c:/usr/bin/perlにperl.exeを配置する方法もあります。

Perlの情報サイトから、まとめて検索