2013-10-04 81 views
0

编辑该问题。我有这个简单的普拉克app.psgi将Plack应用程序与反向代理一起使用 - Plack :: Middleware :: Debug

my $app = sub { 
    my $env = shift; 
    return [ 
     200, 
     ['Content-Type' => 'text/html'], 
     [ "<html><head><title>x</title></head><body><pre>Path info: $env->{PATH_INFO}</pre></body></html>"], 
    ]; 
}; 

use Plack::Builder; 
builder { 
    enable 'Debug'; 
    $app; 
}; 

用一个简单的plackup运行它。

当从本地机器访问:http://localhost:5000/some/path时,它打印: Path info: /some/path并得到了一个很好的工作Plack调试面板。

现在,我有apache:80配置如下:

ProxyPass  /myapp/ http://127.0.0.1:5000/ 
ProxyPassReverse /myapp/ http://127.0.0.1:5000/ 

那么,随之而来的所有请求:http://SITE/myapp/被代理上述普拉克应用。因此,通过

http://SITE/myapp/some/path 

试图访问它时,浏览器再次,正确打印:

Path info: /some/path 

但“普拉克::中间件/调试”不工作,因为他将在未来浏览器的网址:

jquery.js -> /debug_toolbar/jquery.js 
toolbar.min.js -> /debug_toolbar/toolbar.min.js 

当然,theyre不存在。 (他们应该/myapp/debug_toolbar/....

所以,问题是:

  • 什么,我需要做的事情 - 如何改变上述app.psgi得到一个工作程序?
  • 我需要somewhat改变所有传出的网址前缀/myapp/
+0

一个简短的浏览,我发现的东西在这里:'Plack-Middleware-Debug-0.16/lib/Plack/Middleware/Debug.pm' ... var jquery_url ='<%= $stash-> {BASE_URL}%>/debug_toolbar/jquery.js'...你尝试在这里修改路径? –

+0

编辑的问题更容易理解 - 至少我希望... – jm666

回答

3

更新:我想你需要的是添加以下

enable "ReverseProxy";  ## Plack::Middleware::ReverseProxy 
enable "ReverseProxyPath"; ## Plack::Middleware::ReverseProxyPath 

更新:您可能还需要编辑你的apache httpd conf以添加nocanon到proxypass ...

below * * **原装响应

它不是硬编码,看到自己(我不得不

https://github.com/plack/Plack/wiki/How-to-detect-reverse-proxy-and-SSL-frontend http://p3rl.org/Plack::Middleware::ReverseProxy http://advent.plackperl.org/2009/12/day-12-maps-multiple-apps-with-mount-and-urlmap.html

#!/usr/bin/perl -- 
#~ plack-debug-mounted.pl 
#~ 2013-10-17-02:59:26 
#~ 
## perltidy -olq -csc -csci=10 -cscl="sub : BEGIN END if " -otr -opr -ce -nibc -i=4 -pt=0 "-nsak=*" 
#!/usr/bin/perl -- 
use CGI(); 
use Data::Dump qw/ dd pp /; 
use Path::Tiny qw/ path /; 
use Plack::Builder; 
use Plack::Runner; 

my $selfsourceapp = sub { 
    return [ 
     '200', 
     [ 'Content-Type' => 'text/plain', ], 
     [ path(__FILE__)->slurp_raw ], 
    ]; 
}; 
my $dumperapp = sub { 
    my $q = CGI->new($_[0]); 
    return [ 
     '200', [ 
      'Content-Type' => 'text/html', 
      'Content-Length' => '2', 
     ], [ 
      $q->start_html(-title => 'dumpenv.psgi'), 
      $q->h1($_[0]->{SCRIPT_NAME}), 
      $q->Dump, $q->end_html, 
     ], 
    ]; 
}; 

my $indexapp = sub { 
    return [ 
     '200', 
     [ 'Content-Type' => 'text/html', ], 
     [ 
      q{<doctype html> 
<html lang="en-US" charset="UTF-8"> 
<title> Plack perlology </title> 
<body> 
<p> A Plack::Middleware::Debug free zone 
<br> <a href="/"> this </a> 
<br> <a href="/dumpenv"> dupenv </a> 
<br> <a href="/selfsrc"> selfsrc </a> 
<p> Get <c>Plack::Middleware::Debug</c> <b> ed </b> 
<br> <a href="/debugged/"> /debugged/ this </a> 
<br> <a href="/debugged/dumpenv"> /debugged/dupenv </a> 
<br> <a href="/debugged/selfsrc"> /debugged/selfsrc </a> 
<p> Come get some 
<br> <a href="/debugged/debug_toolbar/toolbar.min.css"> 
/debugged/debug_toolbar/toolbar.min.css 
</a> 
<br> <a href="/debugged/debug_toolbar/toolbar.min.js"> 
/debugged/debug_toolbar/toolbar.min.js 
</a> 
<p> Cant get this 
<br> <a href="/debug_toolbar/toolbar.min.css"> 
/debug_toolbar/toolbar.min.css 
</a> 
<br> <a href="/toolbar.min.css"> 
/toolbar.min.css 
</a> 

</body><!-- before this Plack::Middleware::Debug inserts, viewsource!! --> 
} 
     ], 
    ]; 
}; 

my $finalapp = builder { 
    mount '/debugged' => builder { 
     enable 'Debug', panels => [ 
      qw/ 
       Timer 
       Response 
       Environment 
       Session 
       Parameters 
      /
     ]; 
     mount "/dumpenv" => $dumperapp; 
     mount "/selfsrc" => $selfsourceapp; 
     mount "/"  => $indexapp; 
    }; 

    mount "/dumpenv" => $dumperapp; 
    mount "/selfsrc" => $selfsourceapp; 
    mount "/"  => $indexapp; 
}; 

my $runner = Plack::Runner->new; 
$runner->parse_options(qw' --host 127.0.0.1 --port 80 '); 
$runner->run($finalapp); 
+0

我编辑了我的问题。你能帮我在'app.pasi'中改变以获得一个可用的应用程序吗? – jm666

+0

我已更新;)尝试启用ReverseProxyPath ReverseProxy并查看它是否有效 – optional

+0

它的工作原理 - 接受。但是仍然在寻找“如何在逆向代理背后编写_optimal_ Plack应用程序”的“良好指南”:) – jm666

相关问题