Mojolicious::Static - Serve static files
use Mojolicious::Static;
my $static = Mojolicious::Static->new;
push @{$static->classes}, 'MyApp::Controller::Foo';
push @{$static->paths}, '/home/sri/public';
Mojolicious::Static is a static file server with Range
, If-Modified-Since
and If-None-Match
support, based on RFC 7232 and RFC 7233.
Mojolicious::Static implements the following attributes.
my $dir = $static->asset_dir;
$static = $static->asset_dir('assets');
Subdirectory used for all static assets, defaults to assets
.
my $classes = $static->classes;
$static = $static->classes(['main']);
Classes to use for finding files in DATA
sections with Mojo::Loader, first one has the highest precedence, defaults to main
. Only files with exactly one extension will be used, like index.html
. Note that for files to be detected, these classes need to have already been loaded and added before "warmup" is called, which usually happens automatically during application startup.
# Add another class with static files in DATA section
push @{$static->classes}, 'Mojolicious::Plugin::Fun';
# Add another class with static files in DATA section and higher precedence
unshift @{$static->classes}, 'Mojolicious::Plugin::MoreFun';
my $extra = $static->extra;
$static = $static->extra({'foo/bar.txt' => '/home/sri/myapp/bar.txt'});
Paths for extra files to be served from locations other than "paths", such as the images used by the built-in exception and not found pages. Note that extra files are only served if no better alternative could be found in "paths" and "classes".
# Remove built-in favicon
delete $static->extra->{'favicon.ico'};
my $paths = $static->paths;
$static = $static->paths(['/home/sri/public']);
Directories to serve static files from, first one has the highest precedence.
# Add another "public" directory
push @{$static->paths}, '/home/sri/public';
# Add another "public" directory with higher precedence
unshift @{$static->paths}, '/home/sri/themes/blue/public';
my $prefix = $static->prefix;
$static = $static->prefix('/static');
Prefix to use for all static files, defaults to undef
. This can be very useful for production deployments where the reverse proxy server should take over serving static files.
Mojolicious::Static inherits all methods from Mojo::Base and implements the following new ones.
my $path = $static->asset_path('/app.js');
Get static asset path.
my $bool = $static->dispatch(Mojolicious::Controller->new);
Serve static file for Mojolicious::Controller object.
my $asset = $static->file('images/logo.png');
my $asset = $static->file('../lib/MyApp.pm');
Build Mojo::Asset::File or Mojo::Asset::Memory object for a file, relative to "paths" or from "classes", or return undef
if it doesn't exist. Note that this method uses a relative path, but does not protect from traversing to parent directories.
my $content = $static->file('foo/bar.html')->slurp;
my $path = $static->file_path('/index.html');
Get static file path with "prefix" if it has been configured.
my $bool = $static->is_fresh(Mojolicious::Controller->new, {etag => 'abc'});
my $bool = $static->is_fresh(
Mojolicious::Controller->new, {etag => 'W/"def"'});
Check freshness of request by comparing the If-None-Match
and If-Modified-Since
request headers to the ETag
and Last-Modified
response headers.
These options are currently available:
etag => 'abc'
etag => 'W/"abc"'
Add ETag
header before comparing.
last_modified => $epoch
Add Last-Modified
header before comparing.
my $bool = $static->serve(Mojolicious::Controller->new, 'images/logo.png');
my $bool = $static->serve(Mojolicious::Controller->new, '../lib/MyApp.pm');
Serve a specific file, relative to "paths" or from "classes". Note that this method uses a relative path, but does not protect from traversing to parent directories.
$static->serve_asset(Mojolicious::Controller->new, Mojo::Asset::File->new);
Serve a Mojo::Asset::File or Mojo::Asset::Memory object with Range
, If-Modified-Since
and If-None-Match
support.
$static->warmup();
Prepare static files from "classes" and static assets for future use.