Movable Type のサーチ機能(mt-search.cgi)でのCGIエラー解決

 このブログのサーチ機能で今までエラーが出ていたのが、やっと解決した。
 旧サーバー(Cobalt Raq3)では動いていたものが新しいサーバー(Cobalt Raq550)では動かなくなったので、その違いを調べれば簡単に解決するはずだと簡単に考えていたけど、解決までに時間がかかってしまった。

 Perlのバージョンが 5.6 に上がっているので、それが原因ではないかというところまで推測できていて、エラーの場所もほぼ特定できていたけど、商用サーバーなので、うかつに設定をいじってことも許されないのでなかなか手をつけられなかった。

 シェル上で、mt-search.cgi を実行してみると、次のようなエラーが出ていた。

[root cgi-bin]# ./mt-search.cgi
Use of uninitialized value in substitution (s///) at lib/MT/App.pm line 507.
Use of uninitialized value in split at lib/MT/App.pm line 508.
Use of uninitialized value in concatenation (.) at lib/MT/App.pm line 512.
Use of uninitialized value in subroutine entry at /usr/lib/perl5/5.6.0/i386-linux/DB_File.pm line 259.

 他にも同じトラブルを経験している人がいるかもしれないので、サーチエンジンでこれらのエラーメッセージをそのまま入れて検索してみたけれども、役に立つ情報はさほど得られなかった。

 DB_File.pm のバージョンを古いのに戻すと動作するという情報はあったけど、これを試してみたら、サーバーの管理画面が動作しなくなってしまったので、この方法はダメだった。

 ちなみに、旧サーバー(raq3)にインストールされていた DB_File のバージョンは 1.65 で、このサーバーにインストールされているのは 1.72 だった。タイムスタンプを見ると、このファイルだけ新しかったので、後からアップグレードされた可能性はある。どうやら上位互換が保たれていないらしい。

 原因は DB_File.pm のバージョンにあることにほぼ特定できたので、1.66 から 1.71 までのバージョンを1つずつ試してみて両者が動作するものにすれば解決するのでは?と考えたけど、根本から原因が特定できていないので、リスクがあった。やはり、どこの部分が原因で動かないのか? を調べないと気持ちが悪い。

 そこで今日は、DB_File の 1.65 と 1.72 を徹底的に見比べてみたところ、修正は1箇所だけで済むことが分かった。エラーが発生した付近を見比べてみると、バージョン 1.72 は、250行目に次の1行がつけ加えられていた。この行は1.65 にはなかった

$arg[3] = 0666 unless defined $arg[3];

 この行をコメントアウトしたところ、CGIエラーは出なくなった。
 とりあえず、めでたしめでたし、なのだけど、根本的な解決ではない。
 今後、別のサーバーに移したときにまた引っかかる可能性があるからである。

 結局、Movable Type の Search.pm を分析してみないと詳しい原因は分からない。
 他の人にはこういうエラーが出ていないとすれば、インストールか設定に何か間違いがある可能性もあるので、まずはそこから確認してみる必要がある。

 とりあえず、今回はこれで解決ということにしておこうと思う。




Movable Typeスタイル&コンテンツデザインガイド―コンテンツ管理システム(CMS)ツールとしてのMovable Type活用術&実践サイトデザイン術


Movable Typeで今すぐできるウェブログ入門