是否可以编写单个perl cgi脚本来提供所有http请求

时间:2011-04-13 14:41:59

标签: perl cgi

我想知道是否可以使用单个perl cgi脚本来为我的网站提供所有http请求,无论访问者提供什么相对URL。

请分享您的想法。非常感谢。

6 个答案:

答案 0 :(得分:4)

如果您调用脚本index.cgi并将其与mod_rewrite规则相结合,将所有请求重定向到/index.cgi/foo,那么foo将以$ENV{'PATH_INFO'}的形式提供,从而让您知道原始请求路径是什么。

答案 1 :(得分:3)

很有可能像其他人所说的那样使用mod_rewrite。但是你可能不想在CGI程序中这样做。使用CatalystDancer(可能在后端使用Plack)编写适当的Web应用程序要好得多。

答案 2 :(得分:3)

如果您没有真正致力于现有的Web服务器,可以使用以下内容:

use HTTP::Daemon;  # need LWP-5.32 or better
use HTTP::Status; 
use HTTP::Response;
use URI::Heuristic;
my $server = HTTP::Daemon->new(LocalPort => 89);
my $this_url = $server->url;

我从现有程序中抓取了该片段,该程序作为自己的Web服务器运行。不确定在第一个命令之后需要多少“使用”命令,但希望这会给你一些想法。

答案 3 :(得分:1)

您无法设置perl本身来执行此操作。但是,您应该能够将Web服务器配置为将所有请求重定向到单个CGI脚本,通常然后将完整脚本作为参数传递。如果您在Apache上运行,请查看mod-rewrite

答案 4 :(得分:1)

根据提交者的要求,我正在提交更完整版的HTTPD脚本:

#!/usr/bin/perl
use strict;
use warnings;

use HTTP::Daemon;
my $PORT = 89;
my $server = HTTP::Daemon->new(LocalPort =>$PORT);

# Init
print "Starting server at $server->url\n";
print "You can also use http://localhost:$PORT if browsing from the same machine running this script.\n\n";

# Server
my $count=0;
while (my $client = $server->accept) {
  CONNECTION:
    while (my $request = $client->get_request) {
    $count++;
    print "Connection #$count:\n";
        print $request->as_string;
    print "\n";
        $client->autoflush;
      RESPONSE:
    print $client "Relative URL used was " . $request->url->path;
    last CONNECTION;
    }
    $client->close;
    undef $client;
}

而不是打印“使用相对URL的是”的简单行,您很可能想要解析用于执行此脚本为每个HTTP请求执行的任何不同功能的URL。

答案 5 :(得分:0)

不能通过低声誉对davorg发表评论(我是新来的)。

您也可以使用Mojolicious框架。 Mojolicious :: Lite允许您在单个文件中编写完整的应用程序(逻辑,模板等),我猜您正在搜索类似的内容:

http://search.cpan.org/perldoc?Mojolicious::Lite#Wildcard_Placeholders

更多信息:

http://mojolicio.us/