You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),所以可以正常访问;但嵌套路由下,这种自动重定向逻辑不会触发,导致带斜杠的路径无法匹配。

解决方法

有两种常见修复方式:

  1. 开启父路由的尾部斜杠允许匹配
    修改父路由配置,添加->allow_trailing_slash(1),让它同时匹配带/不带尾部斜杠的路径:
    my $myaction = $root->any('/Snipgen')->to(controller=>'Snipgen', action=>'SnipgenPage1')->allow_trailing_slash(1);
    
  2. 将父路由路径改为带尾部斜杠
    把父路由的路径设为/Snipgen/,这样它会直接匹配/Snipgen/,同时嵌套的/show会自动拼接为/Snipgen/show:
    my $myaction = $root->any('/Snipgen/')->to(controller=>'Snipgen', action=>'SnipgenPage1');
    

内容的提问来源于stack exchange,提问作者ferg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 02:20:01