Perl 在Mojo中路由到静态文件

Perl 在Mojo中路由到静态文件,perl,mojolicious,Perl,Mojolicious,我有一个基于Mojolicous的小应用程序。我在public dir中有index.html。当用户请求“/”时,我希望有到该文件的路由 我写了两个解决方案,但我不喜欢它们 第一个解决方案-添加简单控制器 sub stratup { //... $r->get('/')->to('general#index_html'); //... } package MyPackage::General; use Mojo::Base 'Mojolicious::Control

我有一个基于Mojolicous的小应用程序。我在public dir中有index.html。当用户请求“/”时,我希望有到该文件的路由

我写了两个解决方案,但我不喜欢它们

第一个解决方案-添加简单控制器

sub stratup {
  //...
  $r->get('/')->to('general#index_html');
  //...
}

package MyPackage::General;

use Mojo::Base 'Mojolicious::Controller';

use strict;
use warnings;

sub index_html {
    my $self = shift;
    $self->render_static('index.html');
    return;
}

1;
第二个解决方案-添加钩子

sub startup {
    my $self = shift;

    $self->hook(before_dispatch => sub {
            my $self = shift;
            if ($self->req->url eq '/') {
                $self->req->url( Mojo::URL->new('/index.html') );
            }
        });
我想要的是:

$r->get('/')->to('/index.html');
或者类似的


另外,我知道,通常nginx/apache都不这么做,但我使用morbo来运行代码。

到目前为止,最简单的方法是

获取“/”=>“索引”

您需要:

$r->get('...')->to(cb => sub {  
     my $c = shift;                                   
     $c->reply->static('index.html')                
}); 

(只要你还在追求《魔咒》5.45 2014-09-26)

它看起来像是魔咒::Lite。我将它重写为('index')但它不起作用。您尝试过第二种方法吗?第一种方法仅在index.html位于模板目录中时有效。第二种方法是“太大”。它应该可以工作,但我的hook解决方案更小。第二种方法中还有一个非常严重的安全漏洞,因为您没有保护路径遍历。像(例如)
。/../../../../../../../../../../../../../etc/passwd
这样的文件名会提供一些您不想提供的东西,这不是因为Mojolicous中的任何缺陷,而是因为操作系统会按您的要求执行。@Michael sqlbot感谢您指出这一点!我已经删除了有问题的代码,所以没有人在不知道后果的情况下使用它。