Utiliser MoinMoin + lighttpd à la racine d'un site
Lorsqu’il fonctionne via FastCGI ou SCGI, MoinMoin
utilise la variable d’environnement PATH_INFO
1 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 https://github.com/pallets/werkzeug/blob/master/werkzeug/contrib/fixers.py.Recopiez le script
fixers.py
à côté de votre scriptmoin_flup_wsgi.py
.Modifiez le script
moin_flup_wsgi.py
pour qu’il utilise la fonctionLighttpdCGIRootFix
defixers.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', '')
Licence : CC-BY