back in 1998 and 99 there was a longer discussion about scoping problems
with PerlSetEnv (inside httpd.conf and .htaccess files), which ended
with fixes applied to mod_perl-1.20, which is the version I have been
using (along with apache-1.3.6 and perl 5.00404)
Now I am setting up a brand new machine to replace my aging web server
and compiled Perl 5.6.1, apache_1.3.20, and mod_perl-1.25 (Solaris 8)
and the old problem is back, only worse. This is so severe I can't
imagine it happening in all configurations out there, but here is
what I found.
Summary:
1 a variable defined with PerlSetEnv in the main server (outside any
virtual hosts) cannot be changed inside a virtual host section (the
change is ignored)
2 a variable defined inside a virtual host section is visible to all
*other* virtual hosts and the main server
3 a variable defined in httpd.conf cannot be changed inside a .htaccess
file (the change is ignored)
I set up my Apache with a minimal httpd.conf and two IP-based
virtual hosts (besides the main server), configured like this
(plus the necessary "AllowOverride All", etc.; see attached file)
# main server
DocumentRoot "/www/test/root"
PerlSetEnv VarA Global
PerlSetEnv VarB Global
# virthost 1
<VirtualHost IP1>
DocumentRoot "/www/test/root1"
PerlSetEnv VarA VirtHost1
PerlSetEnv VarC VirtHost1
</VirtualHost>
# virthost 2
<VirtualHost IP2>
DocumentRoot "/www/test/root2"
PerlSetEnv VarA VirtHost2
</VirtualHost>
additionally, /www/test/root2 contains this .htaccess file
PerlSetEnv VarB root2
PerlSetEnv VarD root2
Using a Apache::Registry script to print the enviroment in all three
servers (main and the two virtual hosts), I get these values
Var main virthost1 virthost2
VarA Global Global* Global*
VarB Global Global Global*
VarC VirtHost1* VirtHost1 VirtHost1*
VarD - - root2
the entries with the * are wrong, I think.
Has anyone seen something like this before?
Regards,
Roman Maeder
##
## httpd.conf -- Apache HTTP server configuration file
##
ServerType standalone
ServerRoot "/www/apache"
PidFile logs/httpd.pid
ScoreBoardFile logs/httpd.scoreboard
ResourceConfig /dev/null
AccessConfig /dev/null
MinSpareServers 5
MaxSpareServers 10
StartServers 5
#
# Dynamic Shared Object (DSO) Support
#
LoadModule env_module libexec/mod_env.so
LoadModule config_log_module libexec/mod_log_config.so
LoadModule mime_module libexec/mod_mime.so
LoadModule status_module libexec/mod_status.so
LoadModule info_module libexec/mod_info.so
LoadModule autoindex_module libexec/mod_autoindex.so
LoadModule dir_module libexec/mod_dir.so
LoadModule cgi_module libexec/mod_cgi.so
LoadModule alias_module libexec/mod_alias.so
LoadModule access_module libexec/mod_access.so
LoadModule headers_module libexec/mod_headers.so
# Reconstruction of the complete module list from all available modules
# (static and shared ones) to achieve correct module execution order.
# [WHENEVER YOU CHANGE THE LOADMODULE SECTION ABOVE UPDATE THIS, TOO]
ClearModuleList
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_alias.c
AddModule mod_access.c
AddModule mod_headers.c
AddModule mod_so.c
AddModule mod_perl.c
AddHandler cgi-script .cgi
### Section 2: 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition. These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
Port 80
User httpd
Group httpd
AccessFileName .htaccess
DefaultType text/plain
HostnameLookups On
ErrorLog logs/test-error.log
LogLevel info
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/test-access.log combined
PerlSendHeader On
<Files *.pl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Files>
AddType text/html .pl
# main server
DocumentRoot "/www/test/root"
<Directory "/www/test/root">
Options All
AllowOverride All
</Directory>
PerlSetEnv VarA Global
PerlSetEnv VarB Global
# virthost 1
<Directory "/www/test/root1">
Options All
AllowOverride All
</Directory>
<VirtualHost vvv-mc>
DocumentRoot "/www/test/root1"
PerlSetEnv VarA VirtHost1
PerlSetEnv VarC VirtHost1
</VirtualHost>
# virthost 2
<Directory "/www/test/root2">
Options All
AllowOverride All
</Directory>
<VirtualHost vvv-md>
DocumentRoot "/www/test/root2"
PerlSetEnv VarA VirtHost2
</VirtualHost>