Unix の CGI ファイルを Windows 上で動かす

Unix 上の Apahce で動いていた CGI を Windows 上の Apache でそのまま動かすための設定について(主に Perl)。

普通 Unix 上で動かすためには Perl などをパスを /usr/bin/perl のように書くが、Windows 上では C:\Perl\bin\perl.exe などパスが違う。

これを解決するのに以下の方法が有効だった

  1. C:\usr\bin\perl.exe を作る方法
  2. Apache の ScriptInterpreterSource ディレクティブを使う方法

C:\usr\bin\perl.exe を作る方法

Perl の実行ファイルが C:\usr\bin\perl.exe にあると CGI の冒頭に #!/usr/bin/perl と書いてあっても大丈夫なようだ。
そこで C:\Perl 以下をすべて C:\usr 以下にコピーする方法が楽だと思う。
また [リンク/ジャンクション作成ツール] などを使って C:\usr から C:\Perl にリンクを張る方法でも問題なかった。ただしジャンクションを解除するには RMDIR コマンドを使わないといけないので注意。


ScriptInterpreterSource ディレクティブを使う方法

ScriptInterpreterSource ディレクティブを使うと CGI ファイルの shebang 行(冒頭の #! で始まる行)を無視し、拡張子のみ(.pl や .cgi)でスクリプトファイルを関連付け実行できる。
つまり #! の後のパスが間違っていたり #! がない CGI でも実行可能になる。
その代わり .cgi といった拡張子を無理やり Perl などに関連付けるため中身が Perl 以外で書かれていても Perl で実行されてしまう。
.htaccess で設定して局所的に使うのがよさそうだ。

以下に ScriptInterpreterSource ディレクティブの設定方法を書く。

まず httpd.conf や .htaccess 内に ScriptInterpreterSource ディレクティブを追加する。

ScriptInterpreterSource Registry-Strict

使用可能な値は以下の通り。

Registry レジストリーのサブキー Shell\ExecCGI\Command を使用し、存在しなければ Shell\Open\Command を使用し、それもなければデフォルトの動作に戻る
Registry-Strict レジストリーのサブキー Shell\ExecCGI\Command を使用し、存在しなければデフォルトの動作に戻る
Apache 2.0 以降で使用可能
Script デフォルトの動作。レジストリは読みに行かない

Apache2 ならば Registry-Strict がよいと思う。Shell\ExecCGI\Command はデフォルトでは存在しないキーなので意図しないプログラムの実行を避けられるから。


次にレジストリの設定を行う。関連付けしたい拡張子のサブキーの下に関連付けるプログラムのパスを書いていく。

たとえば .cgi に Perl を関連付けしたい場合には以下のように値を追加する。

場所 HKEY_CLASSES_ROOT\.cgi\shell\ExecCGI\command
名前 (規定)
種類 REG_EXPAND_SZ
データ C:\Perl\bin\perl.exe %1

以下に .pl と .cgi を Perl に関連付けする場合のレジストリーファイルを載せる。この内容をテキストファイルに保存して、拡張子を .reg にして実行すれば自動的にレジストリーにインポートされる。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.cgi]

[HKEY_CLASSES_ROOT\.cgi\shell]

[HKEY_CLASSES_ROOT\.cgi\shell\ExecCGI]

[HKEY_CLASSES_ROOT\.cgi\shell\ExecCGI\command]
@=hex(2):43,00,3a,00,5c,00,50,00,65,00,72,00,6c,00,5c,00,62,00,69,00,6e,00,5c,\
00,70,00,65,00,72,00,6c,00,2e,00,65,00,78,00,65,00,20,00,25,00,31,00,00,00


[HKEY_CLASSES_ROOT\.pl]

[HKEY_CLASSES_ROOT\.pl\shell]

[HKEY_CLASSES_ROOT\.pl\shell\ExecCGI]

[HKEY_CLASSES_ROOT\.pl\shell\ExecCGI\command]
@=hex(2):43,00,3a,00,5c,00,50,00,65,00,72,00,6c,00,5c,00,62,00,69,00,6e,00,5c,\
00,70,00,65,00,72,00,6c,00,2e,00,65,00,78,00,65,00,20,00,25,00,31,00,00,00

目次へ