Utiliser MoinMoin avec lighttpd 1.4.19

(English version)

Lorsqu'il fonctionne via FastCGI ou SCGI, MoinMoin utilise la variable d'environnement PATH_INFO1 fournie par le serveur HTTP pour déterminer quelle page il doit afficher.

Dans le cas d'un wiki placé à la racine d'un site (/), la variable PATH_INFO fournie par lighttpd 1.4.19 via FLUP est fausse2.

Les symptômes de ce problème sont les suivants :

Solution propre : utiliser une version plus récente de lighttpd

/!\ Cette solution est la seule qui fonctionne avec MoinMoin 1.9.

À partir de lighttpd 1.4.23, l'option fix-root-scriptname permet de corriger ce problème. Par exemple :

    fastcgi.server = ( "/" =>
      ((
        "host" => "127.0.0.1",
        "port" => 45999,
        "check-local" => "disable",
        "fix-root-scriptname" => "enable",
      ))
    )

Cette option marche pour SCGI et FastCGI.

Solution propre : le script fixers.py de l'équipe Werkzeug

Merci à Thomas Waldmann de m'avoir suggéré cette solution.

  1. Téléchargez le script fixers.py depuis http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/contrib/fixers.py.

  2. Recopiez le script fixers.py à côté de votre script moin_flup_wsgi.py.

  3. Modifiez le script moin_flup_wsgi.py pour qu'il utilise la fonction LighttpdCGIRootFix de fixers.py :

    --- moin_flup_wsgi.py   2009-01-07 00:26:55.000000000 +0000
    +++ moin_flup_wsgi.py.revu      2009-03-02 19:28:19.000000000 +0000
    @@ -41,6 +41,7 @@
    
     from flup.server.fcgi import WSGIServer
     from MoinMoin.server.server_wsgi import moinmoinApp, WsgiConfig
    +from fixers import LighttpdCGIRootFix
    
     class Config(WsgiConfig):
         pass
    @@ -48,7 +49,7 @@
     config = Config()
    
     if __name__ == '__main__':
    -    server = WSGIServer(moinmoinApp, bindAddress=unixSocketPath)
    +    server = WSGIServer(LighttpdCGIRootFix(moinmoinApp), bindAddress=unixSocketPath)
         server.run()
         os.unlink(unixSocketPath)
  4. Compilez ces 2 scripts avec py_compilefiles :

    py_compilefiles *.py
  5. Relancez MoinMoin.

Solution bidouille : correctif MoinMoin

La modification ci-dessous permet de corriger les valeurs fournies par lighttpd. Elle n'est applicable qu'à ce cas particulier.

--- MoinMoin/request/__init__.py.original      2009-02-17 23:04:03.000000000 +0000
+++ MoinMoin/request/__init__.py       2009-02-17 23:04:52.000000000 +0000
@@ -414,8 +414,8 @@
         self.server_name = env.get('SERVER_NAME', self.server_name)
         self.server_port = env.get('SERVER_PORT', self.server_port)
         self.saved_cookie = env.get('HTTP_COOKIE', '')
-        self.script_name = env.get('SCRIPT_NAME', '')
-        self.path_info = env.get('PATH_INFO', '')
+        self.script_name = ''
+        self.path_info = env.get('SCRIPT_NAME', '') + env.get('PATH_INFO', '')
         self.query_string = env.get('QUERY_STRING', '')
         self.request_method = env.get('REQUEST_METHOD', None)
         self.remote_addr = env.get('REMOTE_ADDR', '')