URL Rewriting (réécriture d’URL) avec Lighttpd

closeCet article a été publié il y a 2 ans 5 mois 6 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"
)

Trackback URL

, , , ,

5 Comments on "URL Rewriting (réécriture d’URL) avec Lighttpd"

  1. Nerd Flanders
    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).

  2. Jonathan
    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:

      "^/(.*.(zip|png|jpg|jpeg)$)" => "$0",

    par

    "^/(.*\..{1,4}$)" => "$0",

    ça devrait marcher

  3. Jacques Bodin-Hullin
    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 :)

  4. Stéphane
    31/03/2012 at 0 h 41 min Permalink

    2 ans et demi plus tard …
    Ton article est très intéressant,
    je cherche quant à moi à monter un serveur sur une machine virtuelle ubuntu et j’aimerai mettre en place un daemon lighttpd+mysql pour du dev local (pour le moment).

    Le fonctionnement de la réécriture d’urls m’intéresse car j’aurai besoin d’avoir une configuration proche de la tienne … qui puisse servir les fichiers statiques mais rediriger le reste des requêtes vers le point d’entrée unique de mon application ( projet sous symfony2 )

    Depuis que tu as écrit cet article, ton recule te permettrait-il de me donner quelques conseils (sans doute ?) pour configurer mon serveur ?

    Merci d’avance pour ton aide !

  5. Jérôme
    10/04/2012 at 3 h 05 min Permalink

    @Stéphane, tu peux utiliser le formulaire de contact ici pour m’envoyer un mail (si je peux t’aider ça sera avec plaisir).

Hi Stranger, leave a comment:

ALLOWED XHTML TAGS:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Subscribe to Comments
Get Adobe Flash playerPlugin by wpburn.com wordpress themes