Utiliser MoinMoin + lighttpd à la racine d'un site

Sommaire

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 :

  • Lorsque l’on clique une première fois sur un lien (LienUn), ce lien est bien pris en compte dans la barre d’URL (http://monsite.invalid/LienUn), mais on reste sur la même page.

  • Lorsque l’on clique sur un second lien (LienDeux), la page correspondante s’affiche, mais l’URL affichée contient les deux liens (http://monsite.invalid/LienUn/LienDeux).

Solution propre : utiliser une version plus récente de lighttpd (MoinMoin 1.8 et 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 (MoinMoin 1.8)

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

  1. Téléchargez le script fixers.py depuis https://github.com/pallets/werkzeug/blob/master/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)
  1. Compilez ces 2 scripts avec py_compilefiles :
py_compilefiles *.py
  1. Relancez MoinMoin.

Solution bidouille : correctif MoinMoin 1.9

La modification ci-dessous permet de corriger les valeurs fournies par lighttpd. Elle ne corrige que le connecteur FastCGI (la correction à appliquer au connecteur SCGI devrait être assez proche).

Appliquez le correctif ci-dessous au fichier MoinMoin/support/flup/server/fcgi_base.py :

--- fcgi_base.py.ori	2010-03-15 18:26:22.000000000 +0000
+++ fcgi_base.py	2010-03-15 18:23:25.000000000 +0000
@@ -1075,6 +1075,10 @@
 
         # Mostly taken from example CGI gateway.
         environ = req.params
+
+        environ["PATH_INFO"] = environ["SCRIPT_NAME"] + environ["PATH_INFO"]
+        environ["SCRIPT_NAME"] = ''
+
         environ.update(self.environ)
 
         environ['wsgi.version'] = (1,0)

Solution bidouille : correctif MoinMoin 1.8

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', '')

Licence : CC-BY