テキストエディタで、
#!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ヘッダの出力を先に行わないと「Error message: malformed header from script. Bad header=Hello, World.: sample.cgi」のようにエラーとなります。Perl CGI : Error message: <br />malformed header from script. Bad header=<body>: - Stack Overflow
ブラウザにプログラムのコードがそのまま表示される場合には、設定ファイルに
AddHandler cgi-script .cgi .pl
として、.cgiおよび.plの拡張子を持つファイルがCGIプログラムとみなされるように設定します。
レスポンスで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が返される場合には、
のような原因が考えられます。
バグが原因ならば、それを修正します。パーミッションは「700」のように、オーナーに実行権限が与えられている必要があります。また文字エンコーディングがUTF-8ならば、BOMなしのUTF-8に変更してみます。改行文字がCRLFとなっているならば、LFに変更します。Windowsはいずれも受け入れますが、Unix上ではエラーとなります。
「Error message: malformed header from script.」のようにエラーが表示されるならば、それはContent-Typeヘッダを出力していないためです。この場合にはそれを出力するだけで解決できます。
ブラウザのエラーメッセージでは原因を特定できない場合には、コマンドラインから実行します。perl Filename
として実行すると、詳細なエラーメッセージを確認できます。またはサーバのエラーログで確認しても同じです。
バグの原因が判然としないならば、デバッガで原因を探ります。
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を配置する方法もあります。