2011-05-18 109 views

回答

10

该中间件已在Plack::Builder中完成,Plack::App::URLMap。该吊舱俗话说:

URL映射与主机名也 可能的,在这种情况下,URL映射 就像一个虚拟主机。

语法是在第三安装:

builder { 
     mount "/foo" => builder { 
      enable "Plack::Middleware::Foo"; 
      $app; 
     }; 

     mount "/bar" => $app2; 
     mount "http://example.com/" => builder { $app3 }; 
    }; 
+3

我的天啊。需要更多的RTFM。感谢名单。 – jm666 2011-05-18 15:02:23

1

在这里,例如:一个模块(应用)的一些位点。

你的lib/YourApp.pm应为:

package YourApp; 

    use strict; 
    use warnings; 

    use Dancer ':syntax'; 

    setting apphandler => 'PSGI'; 

    Dancer::App->set_running_app('YourApp'); 

    # This and other routes ... 
    get '/' => sub { 
     # Static and template files will be from different directories are 
     # based by host http header 
     template 'index'; 
    }; 

    1; 

你的bin/app.psgi应为:

#!/usr/bin/perl 
    use strict; 
    use warnings; 

    use Dancer; 

    # The next line can miss but need for quickly loading in L<Starman> server 
    use YourApp; 

    use Plack::Builder; 

    # Please notice that here no need ports in url 
    # So for http://app1.foo.com:3000/ will work 
    # http://app1.foo.com/ 
    my $hosts = { 
     'http://app1.foo.com/' => '/appdir/1', 
     'http://app2.foo.com/' => '/appdir/2' 
    }; 

    builder { 
     my $last; 
     foreach my $host (keys %$hosts) { 
      $last = mount $host => sub { 
       my $env = shift; 
       local $ENV{DANCER_APPDIR} = $hosts->{$host}; 
       load_app "YourApp"; 
       Dancer::App->set_running_app('YourApp'); 
       setting appdir => $hosts->{$host}; 
       Dancer::Config->load; 
       my $request = Dancer::Request->new(env => $env); 
       Dancer->dance($request); 
      }; 
     } 
     $last; 
    }; 

你可以尝试这是我的模块 - 我认为它会更容易对虚拟主机不是建设者&映射:

https://github.com/Perlover/Dancer-Plugin-Hosts