Назад | Перейти на главную страницу

Изменение конфигурации apache с помощью mod_perl не работает!

Предположительно, этот скрипт должен взять * из * .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>?