【问题标题】:Perl web server: How to routePerl Web 服务器:如何路由
【发布时间】:2016-10-31 18:49:25
【问题描述】:

如下面的代码所示,我使用 apache 为我的 Perl Web 服务器提供服务。我需要 Perl 为我的客户提供多条路由,如 my %dispatch 所示。如果我想出一个,我相信其余的会非常相似。如果我们查看我的子例程 sub resp_index,如何修改它以链接到位于我的根目录中的 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";

【问题讨论】:

  • 除非这是一个练习,而不是编写自己的 Web 服务器,不如考虑使用像 Dancer 这样的小型路由框架。另外,所有\ 是怎么回事?最后,我不确定你在问什么。您好像在问如何读取文件?
  • 提示:print "HTTP/1.0 200 OK\r\n"; print $cgi->header; 应该是 print $cgi->header('text/html', '200 OK');,或者更好的是 print $cgi->header;
  • 提示:print "HTTP/1.0 404 Not found\r\n"; print $cgi->header; 应该是 print $cgi->header('text/html', '404 Not found');
  • 提示:每个return if !ref $cgi;都应该删除;它们没用。
  • 提示:my $who = $cgi->param('name'); 应该被移除;该变量从未使用过。

标签: apache perl url-routing


【解决方案1】:

我认为您要问的是如何从您的网络服务器提供文件?像任何其他文件一样打开并打印它。

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>;
}

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

例如,将index.html 之类的文档和perlServer.pl 之类的可执行代码混合在同一目录中会导致安全漏洞。可执行代码应该被隔离在它们自己的目录中,这样它们就可以被赋予完全不同的权限和更强的保护。


我们来说说这条线……

return if !ref $cgi;

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

use Carp;
croak "resp_index() was not given a CGI object" if !ref $cgi;

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

use Method::Signatures;

func resp_index(CGI $cgi) {
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多