プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
エラーメッセージ「attempt to invoke directory as script」とはなんぞや?
結論から書くと、

へーい、おまえさんはディレクトリをスクリプトとして動かそうとしてるぜ~!
無茶言うんじゃねーよ、バーカ、バーカ!(;゚д゚)


なエラーメッセージみたいです。

それでは詳細を書いていきます。

なんかapacheのエラーログを見たら

[Wed Apr 16 08:31:43 2014] [error] [client 192.0.2.0.118] attempt to invoke directory as script: /hoge/cgi-bin/

とか書いてあってですね。
見覚えの無いエラーだなーと思ったのが、調べたきっかけです。

そんでまぁ、あれやこれやと調べたり推測した結果、
エラー自体は権限周りでご立腹、いわゆる403エラーだと分かりました。

具体的な例で言えば、

http://example.com/cgi-bin/



http://example.com/cgi-bin/hoge/

のようにcgi-bin配下のディレクトリを直接指定した場合、
もう少し正確に書くと

「ScriptAlias」の設定がなされているディレクトリに対して、
スラッシュ「/」で終わる(ディレクトリを指定した)URLを指定した場合
※「http://~/cgi-bin/hoge/」みたいな「/」で終わるURLを指定した場合


に発生するエラー……だと推測しています。
ぶっちゃけどこかに答えが書いてあったわけではなくて、
自分でいろいろ実験した結果「そんな感じかな?」と思っただけなので、根拠は無いです。
多分合っているとは思いますが、もし間違っていたらごめんなさい。

ふーん、なるほど。
ただの403エラーか……って、ちょっと待て(--)ノ

「/」終わりのURLを指定したら「index.html」が表示されるはずなんだけど(--?

そう思いつつ、またあれやこれやと調べたり実験したりしたところ、
「ScriptAlias」を設定していると、ファイル名省略時の書き換えをやってくれないみたいです。
試しにcgi-bin/直下に置いた「.htaccess」に

DirectoryIndex index.html

のように追記して「DirectoryIndex」の指定をしてみましたが無意味でした。

ちなみに「DirectoryIndex」はディレクトリ指定時(ファイル名省略時)に何を表示するかの指定ね。
例えば

DirectoryIndex hoge.html hoge2.html index.html

と設定した状態でURL

http://example.com/

にアクセスすると、そこに「hoge.html」があれば

http://example.com/hoge.html

を表示してくれます。
「hoge.html」がなくて「hoge2.html」があれば

http://example.com/hoge2.html

を表示してくれます。
「hoge.html」「hoge2.html」がなくて「index.html」があれば

http://example.com/index.html

が表示されます。
これが「DirectoryIndex」の役割です。

話を戻して、この「DirectoryIndex」の指定をしてもエラーは解消されませんでした。
推測ですが

URLでディレクトリを指定 → あっ、ディレクトリを指定されたからファイルを探すべ

ではなく

URLでディレクトリを指定 → あっ、スクリプトを指定されたから動かすべ → 動かねー、エラーだな!

と解釈しちゃっているのでしょうね。
ディレクトリとして認識する前にスクリプトとして認識してるんじゃないかなぁ、と推測しています。

これをhttpd.confの設定で何とかしようと思ったのですが、
Pleskとの関係で上手く行かなくてですね。

最終的には.htaccessを使って、/cgi-bin/配下のディレクトリに対するアクセスを
すべて該当ディレクトリ内の「index.html」にリライトしてあげることで解決しました。
詳細は

cgi-bin/配下へディレクトリ指定でアクセスすると、403エラーになる(index.htmlが表示されない)のを対処する

の記事をご覧ください。

最後にもう一度まとめると、該当のエラーは「ScriptAlias」が設定されているディレクトリに対して、
ディレクトリ指定のアクセスがあった際に発生するようです。
相手に表示されるエラーは403エラーね。

解決方法は「ScriptAlias」を止めるか、URLを書き換えるなり他に飛ばすなりして
ディレクトリがスクリプトとして認識されないようにしてあげることですかね。
私はディレクトリ指定時にリライトしてやるやり方で対処しました。

ってなところで、取りあえず、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● ネットワーク関連