0

私の要件は以下の通りです。

要求された URL が次のような場合

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

次に、TopModule::ActualModule->method1 () を呼び出す必要があります。

これを行うようにApacheを構成するにはどうすればよいですか?

4

1 に答える 1

0

スクリプト名の後ろの URL 部分は、$ENV{PATH_INFO} で perl プログラムに渡されます。したがって、「 http://whatever.host/modulerunner/Top/Actual/method」のような URL で呼び出すことができる、modulerunner を呼び出す perl スクリプトを作成できます。

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

しかし、私はこれをまったくお勧めしません - それは非常に多くのセキュリティ ホールを開き、Web サイトの訪問者が任意のモジュールで任意の 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 に答える