我正在尝试让mod_perl处理我的apache安装,以便使用perlhandler。
我首先在我的域的子目录中使用此虚拟主机
进行了尝试<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个代码
缺少“print”包而一个缺少“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;
答案 0 :(得分:0)
我一直在努力解决同样的问题,我想我找到了答案:
在Perl中调用对象方法时,例如myinstance-&gt; themethod(arg1)然后themethod获取类(package)的名称作为第一个参数,第一个参数作为第二个参数。如果您将方法称为静态方法,例如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将您的处理程序作为对象方法调用。它将包名称作为第一个参数。如果您添加shift
并在shift
第二个参数之前丢弃第一个参数,那么您的$r
可能就是您正在寻找的请求对象。
再次查看我的Apache conf文件后,我意识到我已经将处理程序指令指定为PerlResponseHandler Fish->chips
而不是PerlResponseHandler Fish::chips
。在查找我想要使用的处理程序时,mod_perl遇到了一些麻烦。当我指定Fish并命名处理程序sub handler {...
时,mod_perl找不到它。同样,当我指定处理程序名称时,如Fish::handler
(或者,我重命名)Fish::chips
,然后Apache将在名为{{1}的目录中查找名为chips.pm
的文件}。
我不知道这是否是mod_perl解析或解析处理程序名称的方式中的实际错误,但至少它是非常脆弱的行为。除非我在这里遗漏了一些东西,如果我是,我希望有人可以指出它。
我希望有所帮助。