Index: web2py-1.96.1/subwsgihandler.py
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ web2py-1.96.1/subwsgihandler.py	2011-06-02 17:01:34.000000000 +0200
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Author: Fred Gansevles <fred@gansevles.net>
+# 
+# subwsgihandler.py -- a *hack* to make web2py sub-url mountable
+#
+# example apache config
+#
+#        WSGIScriptAlias /web2py /usr/local/www/wsgi-scripts/web2py/subwsgihandler.py
+#        WSGIDaemonProcess subweb2py user=www-data group=www-data \
+#                          home=/usr/local/www/wsgi-scripts processes=5 \
+#                          maximum-requests=10000
+#
+#        <Location "/web2py">
+#            Order deny,allow
+#            Allow from all
+#            WSGIProcessGroup subweb2py
+#        </Location>
+#
+# the web2p app is now mounted at http://localhost/web2py
+#
+
+import sys
+sys.path.insert(0, '')
+
+class SubWeb2py(object):
+    def __init__(self, application):
+        self.application = application
+
+        import gluon.html
+        self.gluon_html_URL = gluon.html.URL
+        gluon.html.URL = self.URL
+
+    def URL(self, *args, **kw):
+        # rewrite the generated URLs, so external referencens have the SCRIPT_NAME prefix
+        return self.script_name + self.gluon_html_URL(*args, **kw)
+
+    def start_response(self, status, headers, info=None):
+        # rewrite redirect URLs, so external referencens have the SCRIPT_NAME prefix
+        if not status.startswith('3'):
+            return self._start_response(status, headers, info)
+        # status: 3xx (redirect)
+        _headers = []
+        for key, value in headers:
+            if key == 'Set-Cookie':
+                # don't modify the cookie, it already has a modified location
+                return self._start_response(status, headers, info)
+            # relative URLs start with '/', absolute URLs start with 'http'
+            if key == 'Location' and value.startswith('/'):
+                value = self.script_name + value
+            _headers.append((key, value))
+        return self._start_response(status, _headers, info)
+
+    def __call__(self, environ, start_response):
+        self.script_name = environ['SCRIPT_NAME']
+        environ['SCRIPT_NAME'] = ''
+        if self.script_name and environ['REQUEST_URI'].startswith(self.script_name):
+            environ['REQUEST_URI'] = environ['REQUEST_URI'][len(self.script_name):]
+        self._start_response = start_response
+        return self.application(environ, self.start_response)
+
+from web2py.wsgihandler import application
+application = SubWeb2py(application)
