将 Modperl 配置转换为 Plack - 通过文件扩展名运行不同的处理程序



这是我正在尝试将我当前的 Apache/Modperl 站点转移到 Starman,并且需要为不同的文件扩展名构建具有不同处理程序的 app.psgi。像阿帕奇一样的索姆丁:

<LocationMatch "(.m|.mh|/)$">
     SetHandler              perl-script
     PerlHandler             MyApp::Mhandler
</LocationMatch>
<LocationMatch "(.p|.ph)$">
     SetHandler              perl-script
     PerlHandler             MyApp::Phandler
</LocationMatch>

现在我有:

#app for handle .m and .mh
my $Mapp = Some::PSGI->handler( sub {
...
});
#app for handling .p and .ph
my $Papp = SomeOther::PSGI->handler( sub {
...
});

但是如何使用构建器?

builder {
    #any extension what is not .m .mh .p .ph - handle as static
    #but, only when the request have any extension
    enable "Plack::Middleware::Static",
      path => __what here__, ???
      root => "/my/doc/root";
    #and what here to achieve the following "rules".
    #??? $Papp
    #default $Mapp
};

所需的"规则":

  • 如果请求没有任何扩展名,或者请求以"/"结尾
    • $Mapp处理
  • 如果请求以某个扩展名结尾,则
    • .m.mh应由$Mapp处理
    • .p.ph应由$Papp处理
    • 所有其他带有扩展名的文件(如.css .js .pdf .jpg...)应作为静态文件处理。

当然,将每个静态文件放入某个树中会容易得多,但是给出了当前的应用程序,现在我只想将其移动到 Startman 中,稍后进行重构。

use strictures;
use Plack::Request qw();
use Plack::Builder qw(builder enable);
use Tie::REHash do_cache => 1;
tie my %location_match, 'Tie::REHash';
%location_match = (
    qr'(.m|.mh|/|/[^.]+)$' => sub {[200,[],['Mhandler']]},
    qr'(.p|.ph)$'          => sub {[200,[],['Phandler']]},
);
my $app = sub {
    my ($env) = @_;
    my $req = Plack::Request->new($env);
    my $res;
    if ($location_match{$req->path_info}) {
        printf "path [%s] dispatches to %sn", $req->path_info, $location_match{$req->path_info};
        $res = $location_match{$req->path_info};
    } else {
        die sprintf "no match for path [%s], check routing configurationn", $req->path_info;
    }
    return $res->($env);
};
builder {
    enable 'Static', path => sub {
        my ($path) = @_;
        if ($location_match{$path}) {
            print "redispatchn";
            return;
        } elsif ($path =~ qr'/ [^/]+ [.] [^/]+ $'x) {
            return 1;
        } else {
            die "no match for path [$path], check routing configurationn";
        }
    }, root => './htdocs/';
    $app;
}
__END__
GET 'http://localhost:5000/foo?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo/?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.m?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.mh?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.p?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.ph?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.css?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.js?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.pdf?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.jpg?bar=baz;quux#fnord'

相关内容

  • 没有找到相关文章

最新更新