この記事を読むのに必要な時間は約 9 分です。
Perlで作られたCGIプログラムといえば元々はUNIX系に書かれたもので、IISでCGIが動かないという事例は意外と多いものです。
私もLinux系サーバーで動いたものをIISに移動して動かなくなり、毎度のように苦労しています。
もし動かない場合には、以下をチェックしてみて下さい。
もくじ
①ハンドラーマッピングを再チェック
IISは実行ファイル毎に「ハンドラーマッピング」を追加することになっています。
ハンドラーマッピングとは、拡張子で示されるファイルに要求があった時、どのプログラムに処理を任せるかというマッピングのことです。
CGIなら「*.cgi」にPerlの実行パスを指定しなければ動きません。
Strawberry Perlには予めCPANが組み込まれていますので、追加のモジュールが必要なときに威力を発揮します。
WindowsにはStrawberry Perlをオススメします。
目的のサイト内で使用するなら左のペインで「サイト名」をクリック。

ハンドラーマッピングをクリック。

ハンドラーマッピングにCgiModuleが入っていなければ(初期値)、スクリプトマップの追加をクリック。

要求パスに*.cgi
実行可能ファイルにperl.exe へのパスと %s %sを追記。
名前は覚えやすい名前を入れる。
C:\perl64\bin\perl.exe %s %s
次に「要求の制限」をクリック。
マップ、動詞、アクセスを順に設定。
INTERNAL SERVER ERROR 500
多くは、パスの書き間違いです。
原因を探ることから始めましょう。
IISの場合、初期設定でエラーログはxmlファイルで保存されています。
場所はIISマネージャーの「失敗した要求トレースの規則」をクリック。
右上のトレースの表示をクリック。
エラーファイルをIEで開く。
+のアコーディオンを開く。
するとこんなログが見つかると思います。
指定された CGI アプリケーションは、正しく動作しませんでした。
HTTP ヘッダーの完全なセットが返されませんでした。
返されたヘッダーは "Can't locate ./lib/***.pl in @INC (@INC contains: C:/Perl64/site/lib C:/Perl64/lib .) at D:\usr\www\cgi-bin\****\***:*.cgi line 20.
" です。
これは指定されたディレクトリにモジュールが見つからないというエラーです。
この場合は下を読み飛ばして③へ進んでください。
②perlのパスはあっていますか?
cgiファイルの一行目にperl(perl.exe)へのパスがあります。
初期設定は
#!/usr/local/bin/perl
になっていると思いますが、これはUNIX系のパスですのでIISは修正する必要があります。
ご自分のサーバーに合っているかチェックしてください。
例)
#!C:\Perl\bin\perl
または
#!C:\Perl\bin\perl.exe
③IISの場合のおまじない
require ‘*****.pl’; require ‘******.cgi’ という文字列を探しましょう。
通常、cgiプログラムの最初のほうに書いてあります。
そのひとつ上の行に
$chdir = $0; $chdir =~ s/[^¥¥]*$//; chdir($chdir);
以上3行を書き加えてみてください。(カレントディレクトリ)
④実行フォルダの指定
cgiファイルの2行目付近に
chdir(カレントディレクトリ)を使用して実行cgiのフォルダの場所を明示的に示してやります。
もしもbbsというフォルダ内でのcgiを動かすなら「絶対パス」で指定します。
例)
chdir 'D:¥public_html¥wordpress¥wp-content¥cgi-bin¥bbs';
そして、
require’****.pl’;
require’****setting.cgi’;
等も「絶対パス」に書き換えます。
require 'D:¥public_html¥wordpress¥wp-content¥cgi-bin¥bbs¥****.pl'; require 'D:¥public_html¥wordpress¥wp-content¥cgi-bin¥bbs¥***setting.cgi';
よくあるエラー(Internal Server Error 500-502)「Can’t locate ./lib/***.pl ******`inc***at***line 20.」は、読んでお解りのように***.cgiで指定された20行目に***.plというモジュールが見つからないというエラーです。
***.plが下のようにrequire’****.pl’;で書いてあるとエラーになる場合があります。
#require $***.pl';
require 'D:\usr\www\cgi-bin\bbs\lib\***.pl'; #絶対パスに書き換える
その場合、#でコメントしてその下に
require ’絶対パス’;で***.plの場所を正確に書き直しましょう。
⑤use を requireに書き換えてみる
私がハマったあるCGIでモジュール「Minimal.pm」を読み込めないというエラーが消えず、苦労しました。
useをrequireに変更したところ読み込めるようになりました。
◎変更前
use CGI::Minimal;
◎変更後
require 'D:\usr\www\cgi-bin\bbs\lib\CGI\Minimal.pm';
useとrequireの違いは、useはCGIを読み込む前に予め読み込みますが、requireは、その都度1回だけ読み込みます。
読み込めないモジュールをrequireに書き換えると直るかもしれません。
⑥その他
1)cgiの編集に用いたテキストエディタは文字コードと改行コードの指定できるものですか?
おすすめのエディタは、MKEditor です。
cgiに限らずサーバー上のファイルは文字コードと改行コードがポイントです。
2)perl.exeの環境変数へのパス(path)の登録は済んでいますか?
コントロールパネル➔システム➔システムの詳細設定➔環境変数に追記
;C:\perl64\bin\perl.exe