2010-02-16 14 views
4

Je veux apprendre à DOCUMENT_ROOT startup.pl, mais le mieux que je peux faire est d'apprendre server_root:Comment puis-je apprendre DOCUMENT_ROOT dans startup.pl sous mod_perl2?

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

qui est tout à fait inutile. Je peux définir une variable d'environnement avec

SetPerlEnv DOCUMENT_ROOT /path/to/www 

mais je n'aime pas la configuration supplémentaire si possible.

Existe-t-il un moyen d'obtenir DOCUMENT_ROOT par d'autres moyens?

+0

CGI, mod_perl, autre chose? – djc

+0

App :: Info :: HTTPD :: Apache est un hack, il lit le fichier de configuration Apache. Ce n'est pas sûr. Y a-t-il une solution d'introspection? – codeholic

Répondre

3

Voir Apache2::Directive. Par exemple, sur mon système de développement:

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" ]; 

a créé un fichier C:/bzzzt.txt avec le contenu "E:/srv/unur/deploy/htdocs" après avoir découvert que je devais préciser mes hôtes virtuels à l'aide

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

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

plutôt que <VirtualHost *:8080>. Sinon, chaque section <VirtualHost *:8080> écrasait la précédente.

C'est embêtant. J'aurais pensé que chaque entrée VirtualHost aurait été saisie par le ServerName utilisé. Quant à savoir s'il y a un moyen plus facile, je crains qu'il n'y ait pas si vous voulez faire cela dans startup.pl. Cependant, je ne suis pas sûr s'il est nécessaire de le faire en startup.pl. Vous pouvez trouver la racine du document lors du traitement d'une demande en utilisant Apache2::RequestUtil::document_root.

Si vous utilisez Registry scripts, et que vous voulez changer à DOCUMENT_ROOT, alors vous devriez être en mesure d'ajouter:

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

au script au lieu d'avoir à mess avec startup.pl et manutentionnaires, etc.

+0

N'y a-t-il pas une solution plus facile? – codeholic

+0

Je ne pouvais pas voter parce que je n'avais pas la réputation de 15 :-) Ce que je veux faire est de chdir à DOCUMENT_ROOT, car je dois exécuter du vieux code CGI avec ModPerl :: Registry. PerlInitHandler va-t-il bien dans ce but? – codeholic

+0

@codeholic Désolé, j'ai oublié la chose de 15 points. Merci d'avoir accepté ma réponse. –