PSLブログ

ヨシナシゴトヲツヅリマス

IIS+ActivePerlの相対パス

私のサイトでは、基本的にUNIX系のサーバのみ想定して動作するものを公開しているが、つい先日私のお客さんから、「Windowsサーバで動かしたいが動くか」という確認を求められて、外部モジュールなどが使えるかをテストするcgiファイルを作り、サーバに置いてもらった。ところが

use lib qw(./lib);

などとサーチパスをしているにもかかわらず、その位置に置いたモジュールのインクルードに失敗する。

サーバ会社と直接連絡取れないので、私⇔クライアント⇔エンドクライアント⇔サーバ会社という伝言ゲームをしばらくやっていたが、らちがあかず、私が直接同じレンタル会社のWindows2008サーバのトライアルを申し込んで、直接アップし、アクセス権限を設定して、とテストをしてみた。やはり現象が同じである。サーバ会社に問い合わせたところ、「IIS+ActivePerlの場合、相対パスの起点はcgiファイルが置いてある場所ではなく、ルートディレクトリである」ということがわかった。知らなかった…。

プログラム内に相対パスでファイルを扱っている部分がいくつもあるため、最初はそれらをいちいち直していくことを考えましたが、いったん手を付けてしまうと、直しがあったりしたとき、オリジナルとWindows版と同じ箇所をそれぞれ直していかなければならずとても非効率だ。それより、プログラム冒頭に

BEGIN { chdir "./path/to/cgi"; }

としてしまった方が楽だなと気づき、上記を設定して解決した。

もう一つ、Windowsサーバでやっておかなければならないことは、ファイルの入出力のときに

binmode(FILEHANDLE);

を宣言しておくことだ。これはunix系のOS下では無視されるだけなので、今後は最初から入れておくことにしようと思う。