| Plack documentation | Contained in the Plack distribution. |
Plack::Middleware::Static - serve static files with Plack
use Plack::Builder;
builder {
enable "Plack::Middleware::Static",
path => qr{^/(images|js|css)/}, root => './htdocs/';
$app;
};
Enable this middleware to allow your Plack-based application to serve static files.
If the given request matches with the pattern defined in path, this
middleware will try to locate the file in root. If the file exists
it will be served but otherwise 404 response will be returned. See
pass_through option below to change this behavior.
If the requested document is not within the root (i.e. directory
traversal) or the file is there but not readable, a 403 Forbidden
response will be returned.
The content type returned will be determined from the file extension based on Plack::MIME.
enable "Plack::Middleware::Static",
path => qr{^/static/}, root => 'htdocs/';
path specifies the URL pattern (regular expression) or a callback
to match with requests to serve static files for. root specifies
the root directory to serve those static files from. The default value
of root is the current directory.
This examples configuration serves /static/foo.jpg from
htdocs/static/foo.jpg. Note that the matched /static/ portion is
still appears in the local mapped path. If you don't like it, use a
callback instead to munge $_:
enable "Plack::Middleware::Static",
path => sub { s!^/static/!! }, root => 'static-files/';
This configuration would serve /static/foo.png from
static-files/foo.png (not static-files/static/foo.png). The
callback specified in path option matches against $_ and then
updates the value since it does s///, and returns the number of
matches, so it will pass through when /static/ doesn't match.
If you want to map multiple static directories from different root, simply add "this", middleware multiple times with different configuration options.
By turning on this option, this middleware will pass the request
back to the application for further processing, if the incoming
request path matches with the path but the requested file is not
found on the file system.
Tokuhiro Matsuno, Tatsuhiko Miyagawa
| Plack documentation | Contained in the Plack distribution. |
package Plack::Middleware::Static; use strict; use warnings; use parent qw/Plack::Middleware/; use Plack::App::File; use Plack::Util::Accessor qw( path root encoding pass_through ); sub call { my $self = shift; my $env = shift; my $res = $self->_handle_static($env); if ($res && not ($self->pass_through and $res->[0] == 404)) { return $res; } return $self->app->($env); } sub _handle_static { my($self, $env) = @_; my $path_match = $self->path or return; my $path = $env->{PATH_INFO}; for ($path) { my $matched = 'CODE' eq ref $path_match ? $path_match->($_) : $_ =~ $path_match; return unless $matched; } $self->{file} ||= Plack::App::File->new({ root => $self->root || '.', encoding => $self->encoding }); local $env->{PATH_INFO} = $path; # rewrite PATH return $self->{file}->call($env); } 1; __END__