[Zope] Apache/VHM _and_ AccessRule at the same time

Danny W. Adair danny@adair.net
Mon, 16 Jun 2003 12:33:46 +1200


Hi,

I'm running into some problems having Apache Rewrite -> Virtual Host 
Monster and an Access Rule _at the same time_.

The Access Rule (which extracts an embedded variable from the URL, similar 
to http://www.zope.org/Members/4am/SiteAccess2/otheruse ) works fine when I 
access the Zope Server directly through its IP.

The Apache Rewrite/VHM on the other hand works fine as long as I don't 
access the folder holding the Access Rule. So I assumed both individual 
settings were alright (see below).

But as soon as I access _that_ folder through a domain, I get very weird 
URLs generated on my pages (which don't work of course): The 
VirtualHostBase is _not_ removed, and a "/VHost//" is added after it. I'm 
not sure how to handle this.

Here's my configuration:

--------------------------
Apache
--------------------------
<VirtualHost admin.mydomain.com:80>
RewriteEngine On
ProxyRequests On

CustomLog /cms/Zope/log/zope_access_log combined
ErrorLog /cms/Zope/log/zope_error_log
RewriteLog /cms/Zope/log/zope_rewrite_log
RewriteLogLevel 9

RewriteRule ^/statistics(.*)/ - [L]
RewriteRule ^/(.*) 
http://localhost:8080/VirtualHostBase/http/admin.mydomain.com:80/Interfaces/InterfaceAdmin/VirtualHostRoot/$1 
[P,L]
</VirtualHost>
--------------------------

--------------------------
Zope
--------------------------
/VHost (Virtual Host Monster)
/...
/Interfaces/InterfaceAdmin/x
                           /y
                           /Customers/x
                                     /y
                                     /extractCustomerFromURL (AccessRule)
                                     /Subfolder/x
                                               /y
--------------------------

--------------------------
Access Rule "extractCustomerFromURL"
--------------------------
request = container.REQUEST
stack = request['TraversalRequestNameStack']
customer_id = stack.pop()
request.set('customer_id', customer_id)
request.setVirtualRoot(request.steps + [customer_id])
--------------------------

So "/Customers/mycustomer/Subfolder/x" should call "/Customers/Subfolder/x" 
and set "customer_id" to "mycustomer" in the REQUEST object. 
"/Customers/Subfolder/x" then uses that customer_id to show corresponding 
information.

If I go to 
"1.2.3.4:8080/Interfaces/InterfaceAdmin/Customers/mycustomer/Subfolder/x"
it works, and if I go (no further down than) "admin.mydomain.com/x", 
everything's fine as well.

But "admin.mydomain.com/Customers/mycustomer" (and of course anything 
further down, i.e. .../Subfolder/x) don't work as expected.

For example a link to the subfolder .../Accounts/hisaccount (which I build 
with container['Accounts'].absolute_url() + '/hisaccount') will come out as:

http://admin.mydomain.com/Interfaces/InterfaceAdmin/VHost///Customers/mycustomer/Accounts/hisaccount

The domain is kept, but the VirtualHostRoot /Interfaces/InterfaceAdmin 
remains, and "/VHost//" is appended to it. (A REQUEST dump said exactly 
that same thing...)

Does anyone have an idea on how to solve this?
What exactly is "Virtual Host Monster" (yes the VHM in the Zope root has 
the id "VHost" :-)) doing to the virtual root and how can I work with it as 
intended?

Ideally, a solution would work both ways - IP and domain-based. But I'm 
ready to sacrifice the IP-based access if only the domain rewriting would 
work with my Access Rule... :-(

Any help highly appreciated,
thank you very much in advance,

Danny

P.S.: Please "Reply All" to include my address since I am currently not a 
subscriber of zope@zope.org... Cheers.