apache mod_perl:基于url的动态处理程序

时间:2013-02-27 13:26:36

标签: apache2 mod-perl2

我的要求如下。

如果请求的网址是

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

哦,不要使用&lt; font&gt;标记ony任何有效的;)