gpt4 book ai didi

apache - Perl网络服务器: How to route

转载 作者:行者123 更新时间:2023-12-02 20:55:55 25 4
gpt4 key购买 nike

如下面的代码所示,我使用 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";

最佳答案

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

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) {
...
}

关于apache - Perl网络服务器: How to route,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40348630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com