2016-12-30 35 views
1

我有應用程序,它工作正常。但是現在我們決定把它移到/api的路徑下。所以我用detour如何在'/ 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'); 

但是在這之後沒有任何效果。請求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/?(?:\.([^/]+))?$ 

當請求到來,將針對此正則表達式來檢查:

^\/api/((?^:v\d+))\/users\/me/?(?:\.([^/]+))?$ 

如果只/users/me將在path

被捕獲
+0

這爲什麼有效? – simbabque

+0

@simbabque:查看更新 –

+1

這樣更有用,謝謝:) – simbabque