该脚本应该从 *.domain.com 中取出 *,将其分配给 $subdomain 变量,然后将 $subdomain 放入 AssignUserId。
但是,无论我多么努力,我都无法让它工作。我已经为此工作了好几天,真的很绝望。如果您认为这很麻烦,请向我收取咨询费并获取 root 密码。
有什么想法吗?谢谢...
<Perl>
Use Apache2::ServerRec qw//;
use Apache2::ServerUtil qw//;
use Apache2::RequestRec qw//;
use Apache2::RequestUtil qw//;
use Apache2::Const qw/OK DECLINED/;
my $s = Apache2::ServerUtil->server;
$s->push_handlers(PerlHeaderParserHandler => sub { my($r) = @_;
if ( $r->hostname =~ m/(.*)\.([^.]+\.\w+)$/ ) {
my($subdomain,$domain) = ($1,$2);
#
# THIS WORKS!
# -----------
# if requested domain is fio.domain.com,
# this successfully assigns ServerAdmin [email protected]
# so gathering domain parts working
$r->server->server_admin("$subdomain\@$domain");
#
# THIS DOESN'T!
# --------------
# this is supposed to insert this line inside Virtual host
# --------------
# <IfModule mpm_itk_module> AssignUserId fio domain</IfModule>
# --------------
$r->add_config([ "<IfModule mpm_itk_module>",
"AssignUserId $subdomain $domain",
"</IfModule>",
]);
if ( $@ ) { warn $@ }
return OK;
} else {
return DECLINED;
}
});
</Perl>
答案1
PerlHeaderParserHandler
我最初的猜测是,您已经通过传递给您的钩子$r
或请求对象设置了一个处理程序。
来自文档分配用户 ID(要动态配置的参数)配置上下文必须是 虚拟主机。我猜这意味着您应该根据每个服务器而不是根据每个请求进行配置。
看$s->add_config
文档而不是$r->add_config
。
取决于指令的处理,有可能在调用请求钩子时 AssignUserId 的处理已经发生,在这种情况下,除了将每个子域静态配置为虚拟服务器之外,您无能为力。
更新 1:当然,如果您尝试$s->add_config
对每个请求都使用,则可能会存在内存中存在笨重的服务器配置的风险,因为相同的指令会一遍又一遍地重复。这使得对每个请求都更新服务器配置变得不切实际。
也许仍然可以使用 来执行此操作$r->add_config()
,请注意文档中“配置指令的处理方式就像在 <Location> 块中给出的一样”。您是否尝试过将 AssignUserId 参数放在 <Location> 块中的非 Perl 测试?