---
name: "Mojolicious::Static"
section: "3pm"
platform: "linux"
package: "libmojolicious-perl"
version: "9.39+dfsg-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Mojolicious::Static"
---

# Mojolicious::Static(3pm)

Serve static files

## NAME

Mojolicious::Static - Serve static files

## SYNOPSIS

```
  use Mojolicious::Static;
  my $static = Mojolicious::Static->new;
  push @{$static->classes}, 'MyApp::Controller::Foo';
  push @{$static->paths}, '/home/sri/public';
```

## DESCRIPTION

Mojolicious::Static is a static file server with `"Range"`, `"If-Modified-Since"` and `"If-None-Match"` support, based on RFC 7232 \<https://tools.ietf.org/html/rfc7232\> and RFC 7233 \<https://tools.ietf.org/html/rfc7233\>.

## ATTRIBUTES

Mojolicious::Static implements the following attributes.

### asset\_dir

```
  my $dir = $static->asset_dir;
  $static = $static->asset_dir('assets');
```

Subdirectory used for all static assets, defaults to `"assets"`.

### classes

```
  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';
```

### extra

```
  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'};
```

### paths

```
  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';
```

### prefix

```
  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.

## METHODS

Mojolicious::Static inherits all methods from Mojo::Base and implements the following new ones.

### asset\_path

```
  my $path = $static->asset_path('/app.js');
```

Get static asset path.

### dispatch

```
  my $bool = $static->dispatch(Mojolicious::Controller->new);
```

Serve static file for Mojolicious::Controller object.

### file

```
  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;
```

### file\_path

```
  my $path = $static->file_path('/index.html');
```

Get static file path with "prefix" if it has been configured.

### is\_fresh

```
  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

  ```
    etag => 'abc'
    etag => 'W/"abc"'
  ```

  Add `"ETag"` header before comparing.

- last\_modified

  ```
    last_modified => $epoch
  ```

  Add `"Last-Modified"` header before comparing.

### serve

```
  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.

### serve\_asset

```
  $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.

### warmup

```
  $static->warmup();
```

Prepare static files from "classes" and static assets for future use.

## SEE ALSO

Mojolicious, Mojolicious::Guides, \<https://mojolicious.org\>.
