在Plack::Builder中挂载“hosts”

4

Plack::Builder的简介和这个答案都说:

# in .psgi
use Plack::Builder;

my $app = sub { ... };

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

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

我尝试了以下操作:
use Plack::Builder;
my $app1 = sub { return [200, ['Content-Type' => 'text/plain'], [ "Hello 1"] ]; };
my $app2 = sub { return [200, ['Content-Type' => 'text/plain'], [ "Hello 2"] ]; };
my $app3 = sub { return [200, ['Content-Type' => 'text/plain'], [ "Hello 3"] ]; };

builder {
        mount "/a1" => builder { $app1 };
        mount "http://myhost.com" => builder{ $app2 };
        mount "/" => builder{ $app3 };
}

但是当我尝试使用plackup运行它时,出现了以下错误:

在加载/tmp/app.psgi时出错: 路径需要以/开头, 位于/home/cw/.anyenv/envs/plenv/versions/5.20.3/lib/perl5/site_perl/5.20.3/Plack/Builder.pm 第108行。

出了什么问题?

1个回答

5

在文档中没有明确提到,但是除了主机名之外,您还必须包含路径组件,例如http://myhost.com/foo。请更改。

mount "http://myhost.com" => builder{ $app2 };

to

mount "http://myhost.com/" => builder{ $app2 };

有关代码位于Plack :: App :: URLMap中(mount只是调用了Plack :: App :: URLMap的map方法),在主机myhost.com上的/

if ($location =~ m!^https?://(.*?)(/.*)!) {
    $host     = $1;
    $location = $2;
}

哎呀,这个 bug 真是太蠢了。;( 最好能有明确的文档说明。谢谢!错误信息很令人困惑——它谈论了 _start_。;) - cajwine
1
我也不确定它是否是一个明显的漏洞,尽管文档可能需要更清晰。你应该同时提供主机名和位置信息。http://myhost.com/ 对应于 myhost.com 上的 /http://myhost.com 没有指定位置,只有一个主机名。 - ThisSuitIsBlackNot
1
我的代码有一个小错误 :) - 它的逻辑应该在结尾处添加一个 /。只是文档应该更清晰。谢谢 :) - cajwine
1
不要犹豫,打开拉取请求或问题以使错误更少令人困惑 :) https://github.com/plack/Plack - miyagawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接