Hatena::ブログ(Diary)

うまい棒blog このページをアンテナに追加 RSSフィード Twitter

2010-01-31

MultiViewsMatchのデフォルトの動作 について

MultiViewsを使うとファイル拡張子を省略したURIでもアクセスできるんだけど、これってば(デフォルトでは)mod_mimeに認識される拡張子だけなんすねー。

モジュール版で入れてAddTypeで設定したphpはは拡張子なしでアクセスできたけど、AddHandlerで設定したcgi拡張子なしでアクセスできなくて不思議だったのだ。


実験してた設定

/foo/index.html.phpと/bar/index.html.cgiを用意。

AddType   application/x-httpd-php .php
AddHander cgi-script .cgi

これで4つのURLアクセスしてみた。

$ curl http://example.com/foo/index      -o /dev/null -w "%{http_code}\n" 2> /dev/null
200
$ curl http://exmaple.com/foo/index.html -o /dev/null -w "%{http_code}\n" 2> /dev/null
200
$ curl http://exmaple.com/bar/index      -o /dev/null -w "%{http_code}\n" 2> /dev/null
404
$ curl http://example.com/bar/index.html -o /dev/null -w "%{http_code}\n" 2> /dev/null
404

ただし、index.html.cgiの場合はアクセスしてもnot foundになった。


phpだけアクセスできた理由

参照したblogapacheのdocumentによると、MultiViewsが働くのはデフォルトでmod_mimeで設定されている拡張子のみとのこと。(MultiviewsMatch NegotiatedOnly)

NegotiatedOnlyオプションでは、ベース名に続く拡張子全てが コンテントネゴシエーション

mod_mimeが認識する拡張子(例 文字セット、コンテントタイプ、言語エンコーディング) に

関連付けられていなければなりません。これは副作用の最も少ない 最も的確な実装で、デフォルトになっています。

ちゅーわけなので、cgiの設定を

AddHandler cgi-script .cgi

としている場合ハンドラなので、デフォルトでは動かないってこと??


対策

MultiviewsMatch Handlers

としてMultiviewsMatchにハンドラを設定するか、

AddType application/x-httpd-cgi .cgi

cgimimeタイプに追加するか。