2016-12-30 1 views
1

私はそれが正常に動作するアプリケーションがあります。しかし、今我々はそれを/apiパスの下に移動することに決めた。だから私は'/ api'パスでMojolicious appicationを実行する方法(パス内のプレフィックスを無視する方法)

my $r = $self->routes; 

# Application is always under /api/v1, /api/v2 etc. path 
$r = $r->any('/api/:api', [ api => qr/v\d+/ ])->detour('MyApp'); 

$r->get('/users/me')->to('user#show_me'); 

しかし、この何も動作後detourを使用しています。 site.domain/api/v1へのリクエストにより、アプリケーションは無限ループに陥ります。

Mojolicious::Plugin::Mountもありますが、指定されたルートでmount another one applicationにのみ役立ちます。

Thisガイドでも問題は解決しません。

答えて

6

このラインは、固定されるべきである:

# Application is always under /api/v1, /api/v2 etc. path 
$r = $r->any('/api/:api', [ api => qr/v\d+/ ])->partial(1) 

更新
documentedたとおり

ルートは、残りの文字がパスに捕捉され、何ら特定の端を持っていません。

あなたがmyapp.pl routes -vを実行する場合は、表示されます。

/api/:api  .D.. *  apiapi  ^\/api/((?^:v\d+)) 
    +/users/me .... GET  usersme  ^\/users\/me/?(?:\.([^/]+))?$ 

要求が来たとき、それは、この正規表現に対してチェックされます。

のみ /users/mepath

でキャプチャされます
^\/api/((?^:v\d+))\/users\/me/?(?:\.([^/]+))?$ 

+0

これはなぜ機能しますか? – simbabque

+0

@simbabque:アップデート –

+1

を参照してくださいそれはもっと便利です、ありがとう:) – simbabque

関連する問題