Cet article a été publié il y a 2 ans 1 mois 23 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.A l’occasion du changement de serveur dédié du domaine bordel-de-nerd.net j’ai décidé de tester le serveur web Lighttpd.
Parmi les raisons qui ont motivé mon choix, outre le fait que Lighttpd soit plus performant (moins gourmand en ressources) qu’Apache2 dans la plupart des comparatifs, j’étais particulièrement intéressé par sa capacité à stocker les Vhost hébergés sur la machine dans une base de donnée MySQL.
Cette première partie est fonctionnel, je peux maintenant gérer les vhost depuis MySQL directement sans passer par un fichier de configuration du serveur httpd.
Là ou ça s’est compliqué c’est lorsque j’ai entrepris de migrer le blog sous wordpress d’Apache2 vers Lighttpd.
En effet la manière de gérer la réécriture d’URL est complètement différente d’un serveur à l’autre.
Avec Apache2 mon fichier de réécriture d’URL (.htaccess) était construit de la sorte
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Pour Lighttpd il faut créer un fichier de réécriture des URL pour worpdress ( appelons le wp-rewrite.conf)
vi /etc/lighttpd/wp-rewrite.conf url.rewrite-once = ( "^" + wpdir + "(wp-.+).*/?" => "$0", "^" + wpdir + "(sitemap.xml)" => "$0", "^" + wpdir + "(xmlrpc.php)" => "$0", "^" + wpdir + "keyword/([A-Za-z_0-9-])/?$" => wpdir + "index.php?keyword=$1", "^" + wpdir + "(.+)/?$" => wpdir + "index.php/$1" )
et il faut maintenant ajouter le code suivant dans le fichier de configuration principal « /etc/lighttpd/lighttpd.conf » :
$HTTP["host"] =~ "bordel\-de\-nerd\.net" { var.wpdir = "/" include "wp-rewrite.conf" }
Les deux serveurs utilisent des expressions régulières mais lighttpd dans sa version 1.4.19 ( Debian Lenny) ne vérifie pas l’existence d’un fichier avant la réécriture.
J’avais donc perdu toutes les captures présentent dans les articles (png, jpg) et également les styles css.
A la recherche d’une solution j’ai parcouru les différents sites et forums sur le sujet et il s’avère que dans ses dernières versions, Lighttpd fonctionne de la même manière qu’Apache2 à l’aide de l’option « if-not-file ».
Pas décidé à installer une version instable du serveur, j’ai du chercher une solution.
La première est de ne pas réécrire les URLs si elles se terminent par un .zip, .jpg, .png à l’aide de l’expression régulière suivante
"^/(.*.(zip|png|jpg|jpeg)$)" => "$0",
Cette technique fonctionne mais c’est Jacques Bodin-Hullin (http://www.jacquesbodinhullin.net/) sur twitter qui m’a proposé une solution plus « propre ».
Il m’a proposé cette expression régulière
"^" + wpdir + ".*\..*[^/]$" => "$0"
Avec la mise en place de cette expression, un fichier avec extension sera bien affiché ( pas de réécriture de l’URL ) tandis qu’un dossier ou un bloc qui ne se termine pas par .* sera automatiquement soumis aux règles suivantes.
Voici donc ma configuration au complet qui fonctionne à merveille
cat /etc/lighttpd/wp-rewrite.conf
url.rewrite-once = ( "^" + wpdir + ".*\..*[^/]$" => "$0", "^" + wpdir + "(wp-.+).*/?" => "$0", "^" + wpdir + "keyword/([A-Za-z_0-9-])/?$" => wpdir + "index.php?keyword=$1", "^" + wpdir + "(.+)/?$" => wpdir + "index.php/$1" )
tail /etc/lighttpd/lighttpd.conf -n 5
$HTTP["host"] =~ "bordel\-de\-nerd\.net" { var.wpdir = "/" include "wp-rewrite.conf" }
Un grand merci à Jacques pour ses conseils.
[EDIT]
L’utilisation de cette règle rend indisponible les pages hébergées derrière le nom de domaine « bordel-de-nerd.net » qui ne sont pas dans wordpress.
C’est la cas par exemple pour la page du projet olsvgweb (OpenLayers & SVG Web) http://www.bordel-de-nerd.net/olsvgweb/ de mon ami Jonathan.
J’ai donc modifié les règles de réécriture comme suit.
url.rewrite-once = ( # Ne pas réécrire les URL pour les extensions suivantes "^/(.*.(zip|png|jpg|jpeg)$)" => "$0", # Ne pas réécrire les URL pour ce dossier "^" + wpdir + "wdp_photo/(.*)$" => "$0", # Ne pas réécrire les URL pour ce dossier "^" + wpdir + "olsvgweb/(.*)$" => "$0", "^" + wpdir + "(wp-.+).*/?" => "$0", "^" + wpdir + "(sitemap.xml)" => "$0", "^" + wpdir + "(xmlrpc.php)" => "$0", "^" + wpdir + "keyword/([A-Za-z_0-9-])/?$" => wpdir + "index.php?keyword=$1", "^" + wpdir + "(.+)/?$" => wpdir + "index.php/$1" )
13/12/2009 at 23 h 41 min Permalink
2 articles dans la même journée?
Tu nous gâtes!
En tout cas merci pour cette astuce qui me sera bien utile (je suis aussi en train d’installer un lighttpd sur un serveur).
14/12/2009 at 12 h 39 min Permalink
Merci d’avoir corrigé le problème!
Grâce à ça, l’humanité continuera à avoir accès à cet indispensable projet qu’est olsvgweb!
Cela dit, je pense que la solution que tu proposes n’est pas tout à fait satisfaisante:
Que se passera-t’il si un jour tu décides de proposer un .doc au téléchargement (ou, plus probable, un .odt)?
Tu devras réécrire ton filtre pour accepter la nouvelle extension?
Une solution pourrait être de désactiver la réécriture pour tout type d’extension.
Je pense qu’en remplaçant:
par
ça devrait marcher
14/12/2009 at 20 h 09 min Permalink
@Jonathan : C’est ce que fait la solution finale à l’exception que tu peux avoir des extensions infinies… Une extension de nos jours ne se limite pas à 4 caractères, j’ai quelques fichiers en .numbers par exemple
Conclusion : le .odt passera sans problème