In my previous response on this thread, I suggested that a patch should be made to _q_traverse() when I meant to say try_publish(). Here is the version of Publisher.try_publish() that I think might be helpful: def try_publish(self, request): """(request : HTTPRequest) -> object The master method that does all the work for a single request. Exceptions are handled by the caller. """ self.start_request() path = request.get_environ('PATH_INFO', '') # from pprint import pformat; print pformat(request.environ) if path[:1] != '/': return redirect( request.get_environ('SCRIPT_NAME', '') + '/' + path, permanent=True) components = path[1:].split('/') output = self.root_directory._q_traverse(components) # The callable ran OK, commit any changes to the session self.finish_successful_request() return output Also, and perhaps more useful here, the scgi_server.py program should probably be started with --script-name=/scgi-test so that it will patch up the incorrect values in the environment that comes from lighttpd.