Mojolicious路由问题:访问/Snipgen/时出现页面未找到
嵌套路由访问/Snipgen/出现404的问题排查
问题现象
正常工作的路由配置
sub load_routes { my($self) = @_; my $root = $self->routes; $root->get('/')->to( controller=>'Snipgen', action=>'indexPage'); $root->any('/Snipgen') ->to(controller=>'Snipgen', action=>'SnipgenPage1'); $root->any('/Snipgen/show') ->to(controller=>'Snipgen', action=>'SnipgenPage2'); }
执行./script/snipgen.pl routes -v输出:
/ .... GET ^ /Snipgen .... * Snipgen ^\/Snipgen /Snipgen/show .... * Snipgenshow ^\/Snipgen\/show
出现问题的嵌套路由配置
sub load_routes { my($self) = @_; my $root = $self->routes; $root->get('/')->to(controller=>'Snipgen', action=>'indexPage'); my $myaction = $root->any('/Snipgen')->to(controller=>'Snipgen', action=>'SnipgenPage1'); $myaction->any('/show') ->to(controller=>'Snipgen', action=>'SnipgenPage2'); }
执行./script/snipgen.pl routes -v输出:
/ .... GET ^ /Snipgen .... * Snipgen ^\/Snipgen +/show .... * show ^\/show
此时访问http://127.0.0.1:3000/Snipgen/会返回页面未找到,所有SnipgenPageXX子例程最后一行均为return;。
问题原因
Mojolicious的嵌套路由匹配逻辑中,父路由$root->any('/Snipgen')的匹配规则是^\/Snipgen,该规则仅匹配不带尾部斜杠的/Snipgen路径;而当访问/Snipgen/时,请求路径带有尾部斜杠,无法匹配父路由规则,因此找不到对应的处理action,返回404。
非嵌套路由配置中,Mojolicious会自动处理尾部斜杠的重定向(将/Snipgen/重定向到/Snipgen),所以可以正常访问;但嵌套路由下,这种自动重定向逻辑不会触发,导致带斜杠的路径无法匹配。
解决方法
有两种常见修复方式:
- 开启父路由的尾部斜杠允许匹配
修改父路由配置,添加->allow_trailing_slash(1),让它同时匹配带/不带尾部斜杠的路径:my $myaction = $root->any('/Snipgen')->to(controller=>'Snipgen', action=>'SnipgenPage1')->allow_trailing_slash(1); - 将父路由路径改为带尾部斜杠
把父路由的路径设为/Snipgen/,这样它会直接匹配/Snipgen/,同时嵌套的/show会自动拼接为/Snipgen/show:my $myaction = $root->any('/Snipgen/')->to(controller=>'Snipgen', action=>'SnipgenPage1');
内容的提问来源于stack exchange,提问作者ferg
相关产品推荐
相关产品推荐

