読者です 読者をやめる 読者になる 読者になる

うまいぼうぶろぐ

linuxとhttpdとperlのメモ

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だけアクセスできた理由

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

NegotiatedOnlyオプションでは、ベース名に続く拡張子全てが コンテントネゴシエーション
mod_mimeが認識する拡張子(例 文字セット、コンテントタイプ、言語やエンコーディング) に
関連付けられていなければなりません。これは副作用の最も少ない 最も的確な実装で、デフォルトになっています。

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

AddHandler cgi-script .cgi

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

対策

MultiviewsMatch Handlers

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

AddType application/x-httpd-cgi .cgi

cgimimeタイプに追加するか。