更新 2009-1-14
初版 2006-12-30
Takeshi ITOH

attempt to invoke directory as script

前提または仮定。このエラーメッセージを出すのは Apache Web Server ?

http://www.example.com/cgi-bin/hoge/で index.cgi を起動したい

普通のドキュメントのだと ディレクトリが指定されたときに index.html とか index.php とか を表示してくれます。

http://www.example.com/foo/がリクエストされた
 -> /foo/ のディレクトリの(例えば)index.html を返す

同じように cgi でもディレクトリが指定されたらそのディレクトリにある デフォルトを起動して欲しいと思います。

http://www.example.com/cgi-bin/foo/がリクエストされた
 -> /cgi-bin/foo/ のディレクトリの(例えば)index.cgi を返す

そのために /cgi-bin/foo/ に .htaccess を置いて次のように書きました。

   DirectoryIndex index.cgi

そして http://www.example.com/cgi-bin/foo/ にアクセスすると エラーになりそのときのログを見ると

   [Sat Dec 22 11:20:13 2006] [error] [client 192.0.2.1] attempt to invoke dire
   ctory as script: /home/httpd/cgi-bin/foo

となっています。なにがいけないでしょう。

理由

検索してapache user groupのメイリングリストの以下の記事を見つけました。

そういうものらしいです。

apache のソースをエラーメッセージで grep してみると確かにディレクトリの 場合はエラーにしています。

http://svn.apache.org/viewvc/httpd/httpd/tags/2.0.59/modules/generators/mod_cgi.c?revision=426155&view=markup

    static int cgi_handler(request_rec *r)
    {
    .
    .
    .
        if (r->finfo.filetype == APR_DIR)
            return log_scripterror(r, conf, HTTP_FORBIDDEN, 0,
                                   "attempt to invoke directory as script");

mod_cgiが使われるのはそう設定しているからですね。手元ではhttpd.conf で次 のように設定していました。

ScriptAlias /cgi-bin/ "/home/httpd/cgi-bin/"

ドキュメントを見てみます。

http://httpd.apache.org/docs/2.0/ja/mod/mod_alias.html#ScriptAlias
ScriptAlias ディレクティブは、対象ディレクトリに mod_cgi の cgi-script
ハンドラで処理される CGI スクリプトがあることを示す以外は Alias  ディレ
クティブと同じ振る舞いをします。

つまり /cgi-bin はスクリプトだよと指定されたからディレクトリなんて知らな いよということです。

普通のドキュメントで DirectoryIndex を処理するのは mod_dir です。 http://httpd.apache.org/docs/2.2/ja/mod/mod_dir.html

なぜmod_dirが適用されるのか私には把握できてないのですが。あと適当にググっ ているんで参照/引用しているapacheのバージョンが 2.0だったり2.2 だったり適当で す。ごめんなさい。

対処

あきらめて ファイル名まで指定しましょう。

apacheの設計者達はディレクトリが指定された場合のサーバーの振舞いを一 般のドキュメントディレクトリとスクリプトディレクトリとで違うようしたわけ です。実行されるファイルが曖昧というか判りずらくなるのを避けたのかもしれ ません。

それでも実現する方法はあります。実際のサイトで利用して問題ないかはご 自分で判断してください。

(2007-09-04追記) ScriptAliasMatchを使って解決する方法が KaZ さんの記事で説明されています。
Apacheで、http://hoge.hoge/cgi-bin/foo/にアクセスできるようにする方法
http://blogs.dion.ne.jp/fit_si/archives/5941241.html


Creative Commons License
この作品は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。

日本の法律だと著作権の人格権の放棄ができないようなので CCの BY: 条件を付 けて表示しているけれど public domain として扱ってくれてかまいません。