How can I learn DOCUMENT_ROOT in startup.pl under mod_perl2?
I want to learn DOCUMENT_ROOT in startup.pl, but the best I can do is to learn server_root:
use Apach开发者_StackOverflowe2::ServerUtil ();
$server_root = Apache2::ServerUtil::server_root();
which is quite useless. I can set an environment variable with
SetPerlEnv DOCUMENT_ROOT /path/to/www
but I don't like extra configuration if possible.
Is there a way to get DOCUMENT_ROOT by other means?
See Apache2::Directive. For example, on my development system:
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" ];
created a file C:/bzzzt.txt
with the contents "E:/srv/unur/deploy/htdocs"
after I discovered that I had to specify my virtual hosts using
<VirtualHost unur.localdomain:8080>
...
</VirtualHost>
<VirtualHost qtau.localdomain:8080>
...
</VirtualHost>
rather than <VirtualHost *:8080>
. Otherwise, each <VirtualHost *:8080>
section was overwriting the previous one.
This is annoying. I would have thought each VirtualHost
entry would have been keyed by the ServerName
used.
As for if there is an easier way, I am afraid there isn't if you want to do this in startup.pl
. However, I am not sure if it is necessary to do it in startup.pl
. You can find out the document root while processing a request as well using Apache2::RequestUtil::document_root.
If you are running Registry scripts, and want to change to DOCUMENT_ROOT
, then you should be able to add:
chdir $ENV{DOCUMENT_ROOT}
or die "Cannot chdir to '$ENV{DOCUMENT_ROOT}': $!";
to the script instead of having to mess around with startup.pl
and handlers etc.
精彩评论