如何在'/ api'路径下运行Mojolicious appication(如何忽略路径中的一些前缀)?

时间:2016-12-30 13:34:41

标签: perl mojolicious

我有应用它工作正常。但现在我们决定将其移至/api路径下。所以我使用detour

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指南也无法解决问题。

1 个答案:

答案 0 :(得分: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的位置