0

perlhandler を使用するために、Apache インストールで mod_perl を動作させようとしています。

この仮想ホストを使用して、ドメインのサブディレクトリで最初に試しました

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName ***.fr.cr

    DocumentRoot /var/www/aw
    <Directory /var/www/aw/>
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>

    PerlModule test2::Rules2
    alias /perl2/ /usr/lib/perl5/test2/
    <Location /perl2/>
            Order allow,deny
            allow from all
            SetHandler perl-script
            PerlHandler test2::Rules2
    </Location>

    ErrorLog ${APACHE_LOG_DIR}/aw.error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/aw.access.log combined
</VirtualHost>

ここでは、* .fr.cr/perl2/に移動すると正常に動作しています。

しかし、この仮想ホストを使用して、ドメインのルートに直接実行しようとすると:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName ***.fr.cr

    DocumentRoot /var/www/aw
    <Directory /var/www/aw/>
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>

    PerlModule aw::main
    alias / /usr/lib/perl5/aw/
    <Location />
            Order allow,deny
            allow from all
            SetHandler perl-script
            PerlHandler aw::main
    </Location>

    ErrorLog ${APACHE_LOG_DIR}/aw.error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/aw.access.log combined
</VirtualHost>

エラー 500 が発生しました。Apache ログには次の行があります。

Can't locate object method "content_type" via package "Apache2::RequestRec" at /usr/lib/perl5/aw/main.pm line 6.\n

奇妙なことは、2つのコードでテストしたことです

1 つは「print」パッケージが欠落しており、もう 1 つは「content_type」パッケージが欠落しており、最初のパッケージには「content_type」がありますが、エラーはコードの後半にあります。

仮想ホストで何かが欠けていると思います。同じコードを使用した場合、あるケースでは機能し、別のケースでは機能しないためです。

ありがとう!

編集: コード: 動作していません:

package aw::main;
use Apache2::Const qw(:common);

sub handler {
    my $r = shift;
    $r->content_type("text/plain");
    $r->print("mod_perl rules!\n");
    return OK;
}
1;

そして働く:

package test2::Rules2;
use Apache2::Const qw(:common);

sub handler {
my $r = shift;
$r->content_type("text/plain");
$r->print("mod_perl rules!\n");
return OK;
}
1;
4

1 に答える 1

0

私はちょうど同じ問題に苦しんでいて、私は答えを見つけたと思います:

Perlでオブジェクトメソッドを呼び出すと、たとえばmyinstance-> themethod(arg1)の場合、メソッドはクラス(パッケージ)の名前を最初のパラメーターとして取得し、最初の引数を2番目のパラメーターとして取得します。メソッドを静的メソッドとして呼び出す場合(例:class :: method(arg1))、サブルーチンが取得する最初のパラメーターは最初の引数です。このような:

#!/usr/bin/perl

print "Calling as an object method:\n";
fish->chips('lettuce');
print "Calling as a static method:\n";
fish::chips('lettuce');

{package fish;

sub chips {
  my $x=shift;
  my $y=shift;

  print "\$x is $x and \$y is $y\n";
  }
}

その出力は次のとおりです。

Calling as an object method:
$x is fish and $y is lettuce
Calling as a static method:
$x is lettuce and $y is 

mod_perlは、ハンドラーをオブジェクトメソッドとして呼び出しています。パッケージ名を最初のパラメーターとして使用します。を追加し、2番目のshiftパラメータの前に最初のパラメータを破棄すると、おそらくあなたが探しているリクエストオブジェクトになります。shift$r

Apache confファイルをもう一度見てみると、のPerlResponseHandler Fish->chips代わりにハンドラーディレクティブを指定したことがわかりますPerlResponseHandler Fish::chips。使用したいハンドラーを見つける際にmod_perlで問題が発生しました。Fishを指定してハンドラーに名前を付けたところsub handler {...、mod_perlはそれを見つけることができませんでした。同様に、のようにFish::handler(または名前を変更したときに)ハンドラー名を指定するとFish::chips、Apacheは。chips.pmという名前のディレクトリで名前が付けられたファイルを検索しますFish

これがmod_perlがハンドラー名を解析または解決する方法の実際のバグであるかどうかはわかりませんが、少なくとも非常に脆弱な動作です。私がここで何かを見逃していない限り、そして私がそうであるならば、誰かがそれを指摘できることを願っています。

それがお役に立てば幸いです。

于 2012-12-06T18:57:05.217 に答える