2016-01-21 61 views
4

我已经看过 places找到从应用程序内服务的静态文件的目录的最佳方式,这是尽可能接近我已经能够:服务静态目录从mojolicious以外/公共

package ExampleServer; 
use Mojo::Base 'Mojolicious'; 
use Mojolicious::Static; 

# This method will run once at server start 
sub startup { 
    my $self = shift; 

    $ENV{MOJO_REVERSE_PROXY} = 1; 

    # TODO: generalize 
    my $static_path = '/www/example/docroot/.well-known/acme-challenge/'; 

    # Router 
    my $r = $self->routes; 

    # Normal route to controller 
    $r->get('/')->to('example#welcome'); 

    # serve static directory 
    $r->get('/.well-known/acme-challenge/*filename' => sub { 
     my $self = shift; 
     my $filename = $self->stash('filename'); 
     my $fqfn = $static_path . $filename; 
     $self->app->log->debug($fqfn); 
     my $static = Mojolicious::Static->new(paths => [ $static_path ]); 

     $static->serve($self, $fqfn); 
     $self->rendered; 
    }); 
} 

1; 

这是正确拉出文件名,它仅影响URL的我也想,但不管他们是否在该目录中存在或不是供应空文件。我错过了什么?

回答

2

可能最简单的方法是使用插件RenderFile

package ExampleServer; 
use Mojo::Base 'Mojolicious'; 
use Mojolicious::Static; 

# This method will run once at server start 
sub startup { 
    my $self = shift; 

    $self->plugin('RenderFile'); 

    $ENV{MOJO_REVERSE_PROXY} = 1; 

    # TODO: generalize 
    my $static_path = '/www/example/docroot/.well-known/acme-challenge/'; 

    # Router 
    my $r = $self->routes; 

    # Normal route to controller 
    $r->get('/')->to('example#welcome'); 

    # serve static directory 
    $r->get('/.well-known/acme-challenge/*filename' => sub { 
     my $self = shift; 
     my $filename = $self->stash('filename'); 
     my $fqfn = $static_path . $filename; 
     $self->app->log->debug($fqfn); 
     $self->render_file(filepath=> $fqfn, format => 'txt', content_disposition => 'inline'); 
    }); 
} 

或者你可以从source得到的灵感。