Предположительно, этот скрипт должен взять * из * .domain.com, назначить его переменной $ subdomain, а $ subdomain следует поместить в AssignUserId.
Однако, как бы я ни старался, я не могу заставить это работать. Я работал над этим несколько дней и очень отчаялся. Если вы думаете, что это много работы, пожалуйста, поручите мне консультацию и получите root passwd.
Есть идеи? Спасибо...
<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 fio@domain.com
# 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>
Я предполагаю, что вы настроили обработчик через крючок PerlHeaderParserHandler
к которому вы были переданы $r
, или объект запроса.
Из документации для AssignUserId (параметр, который вы хотите динамически настраивать) контекст конфигурации должно быть виртуальный хост. Предположительно, я подозреваю, что это означает, что вы должны настраивать для каждого сервера, а не для каждого запроса.
Видеть $s->add_config
документация в отличие от $r->add_config
.
В зависимости от обработки директив, возможно, что к тому времени, когда будет вызвана ловушка запроса, обработка AssignUserId уже произошла, и в этом случае вы ничего не можете сделать, кроме статической настройки каждого поддомена как виртуального сервера.
обновление 1: конечно, если вы попробуете использовать $s->add_config
при каждом запросе вы подвергаетесь опасности иметь в памяти громоздкую конфигурацию сервера с одной и той же директивой, повторяющейся снова и снова. Делать обновление конфигурации сервера при каждом запросе нецелесообразным.
Возможно, это еще можно сделать с помощью $r->add_config()
, отмечая из документации, что «Директивы конфигурации обрабатываются так, как если бы они заданы в блоке <Location>». Вы пробовали не-Perl-тест помещать параметр AssignUserId в блок <Location>?