2012-06-24 10 views
6

द्वारा विभिन्न हैंडलर चला रहा है। मैं अपने वर्तमान अपाचे/मॉडपरल साइट को स्टर्मन में स्थानांतरित करने की कोशिश कर रहा हूं, और विभिन्न फ़ाइल एक्सटेंशन के लिए विभिन्न हैंडलर के साथ app.psgi बनाने की आवश्यकता है। Somthing अपाचे में के रूप में:मॉडेल कॉन्फ़िगरेशन को प्लेक में कनवर्ट करना - फ़ाइल एक्सटेंशन

<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 में स्थानांतरित करना चाहते हैं, पुनर्रचना - बाद में।

उत्तर

2
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 %s\n", $req->path_info, $location_match{$req->path_info}; 
     $res = $location_match{$req->path_info}; 
    } else { 
     die sprintf "no match for path [%s], check routing configuration\n", $req->path_info; 
    } 
    return $res->($env); 
}; 

builder { 
    enable 'Static', path => sub { 
     my ($path) = @_; 
     if ($location_match{$path}) { 
      print "redispatch\n"; 
      return; 
     } elsif ($path =~ qr'/ [^/]+ [.] [^/]+ $'x) { 
      return 1; 
     } else { 
      die "no match for path [$path], check routing configuration\n"; 
     } 
    }, 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' 
+0

हुह! इसे समझने के लिए जा रहे हैं। :) – kobame

+0

लेकिन हाँ! मुख्य चाल स्टेटिक के पथ में "उप" का उपयोग कर रही है, और निर्णय के लिए दो ऐप्स को समूहबद्ध कर रही है। बीटीडब्ल्यू, अभी तक किसी भी टाई का उपयोग नहीं किया ..;) बहुत धन्यवाद !!! :) – kobame

संबंधित मुद्दे