【问题标题】:Mount "hosts" in Plack::Builder在 Plack::Builder 中挂载“主机”
【发布时间】:2015-10-01 18:13:54
【问题描述】:

Plack::Builder 和 this answer 的概要说:

# 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/pleenv/versions/5.20.3/lib/perl5/site_perl/5.20.3/Plack/Builder.pm 第 108 行。

怎么了?

【问题讨论】:

    标签: perl plack psgi


    【解决方案1】:

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

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

    到

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

    (即主机myhost.com上的/)

    相关代码在Plack::App::URLMap中(mount只是调用了Plack::App::URLMap的map方法):

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

    【讨论】:

    • 天啊。这真是一个愚蠢的错误。 ;( 很高兴能明确记录这一点。谢谢!错误消息令人困惑 - 它谈到了 start。;)
    • 我不知道这本身是否是一个错误,尽管文档可能更清晰。您应该同时提供主机名和位置。 http://myhost.com/ 对应于myhost.com 上的/; http://myhost.com 没有指定位置,只是一个主机名。
    • 意味着 my 代码中的错误 :) - 有逻辑在末尾有一个 /。只是文档应该更干净。谢谢。 :)
    • 好吧,不要犹豫,打开一个拉取请求或问题,以减少错误的混乱:) github.com/plack/Plack
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2017-06-19
    • 2019-06-22
    相关资源
    最近更新 更多