The Virtual Host Monster supports virtual hosting

It changes the protocol, host, and/or path of URLs generated by Zope. Values affected include REQUEST variables starting with URL or BASE (such as URL1, BASE2, URLPATH0), and the absolute_url() methods of objects. By changing these, the Virtual Host Monster allows you to host several different domains in a single Zope.

The most common sort of virtual hosting setup is one in which you create a Folder in your Zope root for each domain that you want to serve. For instance http://www.buystuff.com is served from Folder /buystuff.com while http://www.mycause.org is served from /mycause.org.

One is enough

A single Virtual Host Monster in your Zope root can handle all of your virtual hosting needs. It doesn't matter what Id you give it, as long as nothing else in your site has the same Id.

You must add special names in the path

The VHM doesn't do anything unless it sees one of the following special path elements in a URL: VirtualHostBase sets the protocol and host, while VirtualHostRoot sets the path root.

If the URL path of a request begins with "/VirtualHostBase/http/www.buystuff.com", for instance, then URLs generated by Zope will start with http://www.buystuff.com. Since the port number was not specified, it is left unchanged. If your Zope is running on port 8080, and you want generated URLs not to include this port number, you must use "/VirtualHostBase/http/www.buystuff.com:80".

If the URL contains VirtualHostRoot, then all path elements up to that point are removed from generated URLs. For instance, a request with path "/a/b/c/VirtualHostRoot/d" will traverse "a/b/c/d" and then generate a URL with path /d.

You add these names by rewriting incoming URLs

Visitors to your site don't see these special names, of course. You insert them into the path using either an external rewriter, such as an Apache RewriteRule or ProxyPass directive, or by setting up a mapping on the "Mappings" tab.

For example, suppose Zope is running on port 8080 behind an Apache running on port 80. You place a Virtual Host Monster in the Zope root Folder, and use Apache to rewrite "/(.*)" to http://localhost:8080/VirtualHostBase/http/www.buystuff.com:80/buystuff.com/VirtualHostRoot/$1.

You could get the same effect in a standalone Zope by adding the line www.buystuff.com/buystuff.com to the "Mappings" tab. In either case, requests for http://www.buystuff.com/anything will look for Zope object /buystuff.com/anything.

You should only use the "Mappings" tab for simple virtual hosting, in a Zope that is serving requests directly. Each mapping line is a host name followed by a path to a Folder. The VHM checks the host specified in each incoming request to see if it is in the list. If it is, then the corresponding path is inserted at the start of the path, followed by "VirtualHostRoot".

You can match multiple subdomains by putting "*." in front of the host name, as in "*.buystuff.com". If an exact match exists, it is used instead of a wildcard match.

Inside-out hosting

Another use for virtual hosting is to make Zope appear to be part of a site controlled by another server. For example, Zope might only serve the contents of http://www.mycause.org/dynamic_stuff. To accomplish this, you want to add "dynamic_stuff" to the start of all Zope-generated URLs.

If you insert VirtualHostRoot, followed by one or more path elements that start with '_vh_', then these elements will be ignored during traversal and then added (without the '_vh_') to the start of generated URLs. For instance, a request for "/a/VirtualHostRoot/_vh_z/" will traverse "a" and then generate URLs that start with /z.

In our example, you would have the main server send requests for http://www.mycause.org/dynamic_stuff/anything to Zope, rewritten as /VirtualHostRoot/_vh_dynamic_stuff/anything.