Catalyst::Request#pathの値に、LocationMatchでマッチした文字列がくっつく(2)

Catalyst::Request#pathの値に、LocationMatchでマッチした文字列がくっつく - ヒルズで働く@robarioの技ログ
id:dayflowerさんからコメントをいただきました!サイトの方何度も拝見させていただいています!ありがとうございます!

mod_perlかApache APIの仕様に対処するためnon-rootなLocationのハンドラだった場合に
Catalystがよしなに計らおうとしていることが(LocationMatchによって)裏目にでているみたいです。
って自分ですら読解不能な記述をしてしまいました(笑)。
あまり参考になりませんが現象としては
http://d.hatena.ne.jp/dayflower/20060510/1147260763
を,原因としてはCatalyst::Engine::Apacheのソースをごらんください

ヒントとmod_perl 2.0 での SCRIPT_NAME - daily dayflowerを元に調べてみたところ、Apache2::RequestUtil#locationが返す値は、とにかくそのディレクティブに書かれている文字列です。つまりLocationMatchを用いた場合は「マッチに成功した文字列」ではなく「マッチングに使用した正規表現」が返ってきます。例えば

PerlModule Apache2::RequestUtil
<LocationMatch "^/[^\.]*(\?|$)">
  SetHandler perl-script
  PerlResponseHandler 'sub {print shift->location();return OK}'
</LocationMatch>

のように、正規表現を用いてマッチさせそのlocationを出力しようとする場合、その出力は

^/[^\.]*(\?|$)

になります。リクエストが/abcでも/abc/def/ghiでも関係ありません。Apache2::RequestUtil#locationはマッチングに使用した正規表現を返します。ModPerlの仕様なのかApacheの仕様なのかは調べていないのですが、Catalystは単にlocationを見ているだけなので悪くない気がします。
もうちょっと先まで調べてみました
そこでModPerlのソースをたぐっていくとApache2::RequestUtil#locationの実装は
/usr/local/src/mod_perl-2.0.2/xs/Apache2/RequestUtil/Apache2__RequestUtil.h
にありました。

char *mpxs_Apache2__RequestRec_location(request_rec *r)
{
    MP_dDCFG;

    return dcfg->location;
}

設定ファイルの情報をそのまま返していますね。Apache2::RequestRecパッケージではなくApache2::RequestUtilパッケージのメソッドなので、リクエストごとに変化するものではないというこの挙動は合っているんでしょう。Apacheの仕様であり、またModPerlの仕様でもあるので、結局Catalystが悪い、ということになりますね。
続きを書きました→Catalyst::Request#pathの値に、LocationMatchでマッチした文字列がくっつく(3) - ヒルズで働く@robarioの技ログ