Amon2で最後/(スラッシュ)ありなしを吸収してDispatchする時のメモ。

アプリじゃなくてNginxとかApacheでやってもいいんですけど、オレオレFlavorに入れとけばいいかなと。

use MyApp::Web::Dispatcher;

get '/' => 'Root#index';
get '/hoge' => "Hoge#index";
1;

上記みたいなDispatcherを書いた場合、
/hoge
へアクセスすれば、該当のController(Hoge->index)が呼ばれるんですが、これを
/hoge/
と最後にスラッシュが付いた状態でアクセスすると404になってしまうんで、BEFORE_DISPATCH(Dispatcherが呼ばれる前)でなんとかする。

package MyApp::Web;

__PACKAGE__->add_trigger(
    BEFORE_DISPATCH => sub {
        my $c = shift;

        if ( $c->req->env->{'PATH_INFO'} =~ /\/$/ ) {
            $c->req->env->{'PATH_INFO'} =~ s/\/$//;
            unless ( $c->req->env->{'PATH_INFO'} ) {
                $c->req->env->{'PATH_INFO'} = '/';
            }
        }
    }
);

BEFORE_DISPATCHで、PATH_INFOから最後の/を消し去るだけです。
で、Room->indexへのアクセス(/)ができなくなってしまうので、消した結果何も無くなった場合は、’/’にしとく。