在Mojolicious中能否内部转发到其他action而不暴露重定向路径?
Mojolicious Lite服务端内部路由转发实现方案
完全可以实现,Mojolicious原生支持服务端内部请求转发,不需要触发客户端302/301重定向,不会对外暴露目标路径。
最优实现方案(推荐)
优先通过给目标路由命名,使用forward_to方法完成转发,代码最简洁可维护:
# 第一步:给目标路由设置自定义名称 get '/icon/:color/:library/*icon' => { controller => 'Icons', action => 'serve_marker_icon_embedded' } ->name('serve_marker_icon'); # 第二步:修改原路由逻辑,替换重定向为内部转发 get '/icon/map/:item/:color' => sub ($c) { my ($library, $path) = split /\//, $icon_mapping->{$c->stash('item')}, 2; # 填充目标路由需要的所有捕获参数 $c->stash( library => $library, icon => $path ); # 内部转发到指定路由,无任何客户端交互 $c->forward_to('serve_marker_icon'); };
无需路由命名的兼容方案
如果不想修改原目标路由的定义,也可以直接指定控制器和Action完成转发:
get '/icon/map/:item/:color' => sub ($c) { my ($library, $path) = split /\//, $icon_mapping->{$c->stash('item')}, 2; # 手动指定路由参数、控制器和处理方法 $c->stash( library => $library, icon => $path, controller => 'Icons', action => 'serve_marker_icon_embedded' ); # 触发路由调度执行目标逻辑 $c->app->routes->dispatch($c); # 标记请求处理完成,避免触发默认渲染逻辑 $c->rendered unless $c->stash('mojo.finished'); };
注意事项
- 内部转发会自动保留当前请求的所有请求头、Cookie、Session信息,和直接访问目标路由的执行效果完全一致
- 如果出现参数冲突问题,可以在转发前执行
$c->stash('mojo.captures', {});清空上一级路由的捕获参数 - 整个过程客户端地址栏不会发生任何变化,目标路由路径完全不会对外暴露
内容的提问来源于stack exchange,提问作者simone
相关产品推荐
相关产品推荐

