Utiliser MoinMoin + lighttpd à la racine d'un site
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.
Téléchargez le script fixers.py depuis http://dev.pocoo.org/projects/werkzeug/browser/werkzeug/contrib/fixers.py.
Recopiez le script fixers.py à côté de votre script moin_flup_wsgi.py.
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)Compilez ces 2 scripts avec py_compilefiles :
py_compilefiles *.py
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', '')
Commentaires et suggestions
N'hésitez pas à m'envoyer vos critiques, suggestions et idées d'améliorations à l'adresse <jean DASH philippe DOT guerard AT tigreraye DOT org>.

