0

我的要求如下。

如果请求的 url 像

http://localhost/mod_perl/TopModule/ActualModule/method1

然后我应该调用 TopModule::ActualModule->method1 ()

如何配置 Apache 来执行此操作?

4

1 回答 1

0

脚本名称后面的 URL 部分在 $ENV{PATH_INFO} 中传递给你的 perl 程序。因此,您可以创建一个称为 modulerunner 的 perl 脚本,您可以使用类似“ http://whatever.host/modulerunner/Top/Actual/method ”的 URL 来调用它:

my $arg=$ENV{PATH_INFO};        <-- contains Top/Actual/method
my @arg=split("/", $arg);       <-- [ "Top", "Actual", "method" ]
my $method=pop @arg;            <-- removes "method", "Top" and "Actual" remain in @arg
my $modules=join("::", @arg);   <-- "Top::Actual"
my $call="$modules->$method()"; <-- "Top::Actual->method()"
eval $call;                     <-- actually execute the method

然而,我完全不推荐这个——它打开了太多的安全漏洞,允许你的网站访问者调用任何模块中的任何 perl 函数。所以,除了你在自己的服务器上做这个没有连接到其他任何东西,我只会去一个非常无聊的 if-then-cascade 。

$p=$ENV{PATH_INFO};
if     ($p eq "Top/Actual/method") { Top::Actual->method(); }
elseif ($p eq "Other/Module/function" { Other::Module->function(); }
else {
    print "<font color=red>Don't try to hack me this way, you can't.</font>\n";
}

哦,也不要在任何有生产力的东西上使用 <font> 标记;)

于 2013-12-05T16:40:57.057 回答