2010-02-16 2 views
4

Я хочу научиться DOCUMENT_ROOT в startup.pl, но лучшее, что я могу сделать, это научиться server_root:Как я могу узнать DOCUMENT_ROOT в startup.pl в mod_perl2?

use Apache2::ServerUtil(); 
$server_root = Apache2::ServerUtil::server_root(); 

, которое совершенно бесполезно. Я могу установить переменную окружения с помощью

SetPerlEnv DOCUMENT_ROOT /path/to/www 

, но мне не нравится дополнительная настройка, если это возможно.

Есть ли способ получить DOCUMENT_ROOT другими способами?

+0

CGI, mod_perl, что-то еще? – djc

+0

App :: Info :: HTTPD :: Apache - это взлом, он читает конфигурационный файл Apache. Это небезопасно. Есть ли интроспективное решение? – codeholic

ответ

3

См. Apache2::Directive. Например, в моей системе развития:

use Apache2::Directive(); 
my $tree = Apache2::Directive::conftree(); 
my $vhost = $tree->lookup(VirtualHost => 'unur.localdomain:8080'); 

File::Slurp::write_file "C:/bzzzt.txt", [ $vhost->{DocumentRoot}, "\n" ]; 

создан файл C:/bzzzt.txt с содержимым "E:/srv/unur/deploy/htdocs" после того, как я обнаружил, что я должен указать свои виртуальные хосты с помощью

<VirtualHost unur.localdomain:8080> 
... 
</VirtualHost> 

<VirtualHost qtau.localdomain:8080> 
... 
</VirtualHost> 

, а не <VirtualHost *:8080>. В противном случае каждый раздел <VirtualHost *:8080> перезаписывал предыдущий.

Это раздражает. Я бы подумал, что каждая запись VirtualHost была бы использована с использованием ServerName.

Что касается, если есть более простой способ, я боюсь, что нет, если вы хотите сделать это в startup.pl. Однако я не уверен, что это необходимо сделать в startup.pl. Вы можете узнать корень документа при обработке запроса, используя Apache2::RequestUtil::document_root.

Если вы работаете Registry scripts, и хотите, чтобы изменить DOCUMENT_ROOT, то вы должны быть в состоянии добавить:

chdir $ENV{DOCUMENT_ROOT} 
    or die "Cannot chdir to '$ENV{DOCUMENT_ROOT}': $!"; 

к сценарию, вместо того, чтобы возиться с startup.pl и обработчиков и т.д.

+0

Нет ли более простого решения? – codeholic

+0

Я не мог проголосовать, так как у меня не было репутации 15 :-) Что я хочу сделать, так это chdir для DOCUMENT_ROOT, так как мне нужно запустить старый код CGI с помощью ModPerl :: Registry. Для этого подходит PerlInitHandler? – codeholic

+0

@codeholic Извините, забыли о 15-очковой вещи. Спасибо, что приняли мой ответ. –