扶凯

取势 明道 优术

作者为 扶 凯 发表

最开始几个文章讲的使用 plackup 来服务当前目录的文件,现在我们学习了怎么样使用中间件和怎么使用 URLMap 来服务多个应用.这又是非常琐碎的功能之一, 你的应用开发所必须的:服务静态文件.

从指定的路径请取文件
很多的框架自己实现了这个功能,但使用了 PSGI 和 Plack 起,框架可以不需要实现此功能了.只需使用 Static 中间件.

use Plack::Builder;

my $app = sub { ... };

builder {
    enable "Static", path => qr!^/static!, root => './htdocs';
    $app;
}

这会截取全部以 "/static" 的 request,然后映射到 root 目录 htdocs 目录.所以当你请求 "/static/images/foo.jpg" 结果会返回 "./htdocs/static/images/foo.jpg" 这个文件.
常常,我们会想重命名和配置一个目录的名字为一个新的名字,如请求 "/static/index.css" 映射到 "./static-files/index.css",你只要如下操作就行:

builder {
    enable "Static", path => sub { s!^/static/!! }, root => './static-files';
    $app;
}

这有个重要的地方,就是使用的回调函数中的 patterm 是使用的 sub {s///} 来替换正则 qr.这个回调中 matche 到的 $_ 会做为 request 的路径,所以在这个地方使用的  来替换掉前面一部分.所以会这时前的 static 就会没有了,直接打开 root 下的 "./static-files/" 目录
因此,"/static/foo.jpg" 会被指到 "./static-files/foo.jpg",全部的请求如果不能 match 这个正则的话,就通过源始的路径到 $app 中来.
在 Perl 中讲任何事情都不只一个以上的方式去做.当你了解如何使用 mount 和 URLMap 然后使用 App::File 的 mount 应该更加直观.前面的例子可以这样写:

use Plack::Builder;

builder {
    mount "/static" => Plack::App::File->new(root => "./static-files");
    mount "/" => $app;
};

这的方法不同,但我想前面这个比现在这个更加常用,因为上面的 Static 的静态中间件的回调,是使用基于配置的路径,让你可以写更加复杂的正则.当你不合适使用 URLMap 和 mount 选择上面的方法是更加合适你的.

这是我的译文,原文件地址:http://advent.plackperl.org/2009/12/day-17-serving-static-files-from-your-application.html

 

 

来了就留个评论吧! 1个评论