apache mod_perl: динамический обработчик на основе URL

Мое требование, как показано ниже.

если запрошенный URL-адрес, как

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

Тогда я должен вызвать TopModule::ActualModule->method1 ()

Как я могу настроить Apache для этого?

1 ответ

Часть URL за именем скрипта передается вашей perl-программе в $ENV{PATH_INFO}. Таким образом, вы можете создать Perl-скрипт, который вы называете modulerunner, который вы можете вызывать с помощью URL-адреса, например " 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 в любом модуле. Итак, кроме того, что вы делаете это на своем собственном сервере, который не подключен ни к чему другому, я бы просто пошел на очень скучный каскадный процесс.

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

Да, и не используйте тег только для чего-нибудь продуктивного;)

Другие вопросы по тегам