私の要件は以下の通りです。
要求された URL が次のような場合
http://localhost/mod_perl/TopModule/ActualModule/method1
次に、TopModule::ActualModule->method1 () を呼び出す必要があります。
これを行うようにApacheを構成するにはどうすればよいですか?
スクリプト名の後ろの 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> タグを使用しないでください ;)