Perl Web服务器:如何路由

Paz*_*uzu 1 apache perl url-routing

如下面的代码所示,我使用apache来服务我的Perl Web服务器.我需要Perl为我的客户端提供多条路由,如图所示my %dispatch.如果我找到一个,我肯定其余的会非常相似.如果我们查看我的子例程sub resp_index,如何修改它以链接到我的root:目录中的index.html文件/var/www/perl

/var/www/perl/perlServer.pl:

#!/usr/bin/perl

{
    package MyWebServer;

    use HTTP::Server::Simple::CGI;

    use base qw(HTTP::Server::Simple::CGI);

    my %dispatch = (
        '/index.html' => \&resp_index,
        # ...
    );

    sub handle_request {
        my $self = shift;
        my $cgi  = shift;

        my $path = $cgi->path_info();
        my $handler = $dispatch{$path};
        if (ref($handler) eq "CODE") {
            print "HTTP/1.0 200 OK\r\n";
            $handler->($cgi);
        } else {
            print "HTTP/1.0 404 Not found\r\n";
            print $cgi->header,
                $cgi->start_html('Not found'),
                $cgi->h1('Not found'),
                $cgi->end_html;
        }
    }

    sub resp_index {
        my $cgi  = shift;   # CGI.pm object
        return if !ref $cgi;

        my $who = $cgi->param('name');

        print $cgi->header,
            $cgi->start_html("index"),
            $cgi-h1("THIS IS INDEX"),
            $cgi->end_html;
    }
}

my $pid = MyWebServer->new()->background();
print "Use 'kill $pid' to stop server.\n";
Run Code Online (Sandbox Code Playgroud)

Sch*_*ern 5

我想您所问的是如何从Web服务器提供文件?像任何其他文件一样打开它并打印它.

use autodie;

sub resp_index {
    my $cgi  = shift;
    return if !ref $cgi;

    print $cgi->header;

    open my $fh, "<", "/var/www/perl/index.html";
    print <$fh>;
}
Run Code Online (Sandbox Code Playgroud)

除非这是一个练习,否则真的,真的,真的,不要编写自己的Web框架.这将是缓慢,错误和不安全的.考虑像Dancer这样的小型路由框架.

例如,index.htmlperlServer.pl在同一目录中混合文档和可执行代码会引发安全漏洞.可执行代码应该在它们自己的目录中隔离,这样它们就可以获得完全不同的权限和更强的保护.


我们来谈谈这条线......

return if !ref $cgi;
Run Code Online (Sandbox Code Playgroud)

这一行隐藏了一个错误.如果你的函数被传递错误的参数,或者没有参数,它将默默地返回,你(或使用它的人)将不知道为什么没有发生任何事情.这应该是一个错误......

use Carp;
croak "resp_index() was not given a CGI object" if !ref $cgi;
Run Code Online (Sandbox Code Playgroud)

...但实际上您应该使用现有的函数签名模块之一,例如Method :: Signatures.

use Method::Signatures;

func resp_index(CGI $cgi) {
    ...
}
Run Code Online (Sandbox Code Playgroud)