I just finished configuring a Trac instance for IMAPClient. To keep page response times tolerable I'm using FastCGI.
It turns out there's a little gotcha when you serve an app at the root (ie. "/") using FastCGI with Lighttpd. It passes the wrong SCRIPT_NAME and PATH_INFO to the app causing unexpected behaviour. The problem isn't there if the app is served from a prefix (eg. "/trac").
The problem is apparently fixed somewhere in Lighttpd 1.5 but I'm on 1.4.13 as shipped with Debian.
With Trac there is a workaround. If you modify Trac's FastCGI runner (fcgi_frontend.py) to correct the SCRIPT_NAME and PATH_INFO environment variables before the rest of the app sees them, the problem is solved. Here's what my fcgi_frontend.py now looks like (header comments removed):
import pkg_resources from trac import __version__ as VERSION from trac.web.main import dispatch_request from os import environ import _fcgi def application(environ, start_request): environ['PATH_INFO'] = environ['SCRIPT_NAME'] + environ['PATH_INFO'] environ['SCRIPT_NAME'] = '' return dispatch_request(environ, start_request) def run(): _fcgi.WSGIServer(application).run() if __name__ == '__main__': pkg_resources.require('Trac==%s' % VERSION) run()
Figuring this out cost me lots of time. Hopefully this information helps someone else out.