Table Of Contents

Virtual Host

Contents

Recipe

Sometimes you may want to route visitor to different page who visits your site with different domain names. As known as “Virtual Host”, it is possible to achieve this with TurboGears. As far as TurboGears based on cherrypy, what you need is to use a cherrypy filter VirtualHostFilter. The filter can be found at cherrypy/filters/virtualhostfilter.py under cherrypy 2.3 package. You can use directly with simple configuration.

virtual_host_filter.on = True
#use this option if your site is under a proxy
#virtual_host_filter.use_x_forwarded_host = True
virtual_host_filter.examplesite.com = "/examplesite_com"
virtual_host_filter.anothersite.com = "/anothersite_com"

And modify the root controller

from cherrypy.filters.virtualhostfilter import VirtualHostFilter
class Root(tg.controllers.RootController):
    _cp_filters = [VirtualHostFilter()]

    [...]

Here you are, all visitor visit your site with examplesite.com will be internal redirected to /examplesite_com/.

If you want to do more than static route, you can even route dynamically. For example:

class VirtualHostFilter(BaseFilter):
    def before_request_body(self):
        if not cherrypy.config.get('site_virtual_host_filter.on', False):
           return

        domain = cherrypy.request.headers.get('Host', '')
        if cherrypy.config.get("site_virtual_host_filter.use_x_forwarded_host", True):
            domain = cherrypy.request.headers.get("X-Forwarded-Host", domain)
        site = model.Site.get_by(domain_name=domain)
        if site:
            prefix = "/site/%s" % site.site_name
            cherrypy.request.object_path = prefix + cherrypy.request.object_path

class Root(tg.controllers.RootController):
    _cp_filters = [VirtualHostFilter()]