Unix 上の Apahce で動いていた CGI を Windows 上の Apache でそのまま動かすための設定について(主に Perl)。
普通 Unix 上で動かすためには Perl などをパスを /usr/bin/perl のように書くが、Windows 上では C:\Perl\bin\perl.exe などパスが違う。
これを解決するのに以下の方法が有効だった
Perl の実行ファイルが C:\usr\bin\perl.exe にあると CGI の冒頭に #!/usr/bin/perl と書いてあっても大丈夫なようだ。
そこで C:\Perl 以下をすべて C:\usr 以下にコピーする方法が楽だと思う。
また [リンク/ジャンクション作成ツール] などを使って C:\usr から C:\Perl にリンクを張る方法でも問題なかった。ただしジャンクションを解除するには RMDIR コマンドを使わないといけないので注意。
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