Url rewriting pour StatusNet sous Lighttpd
Tout récemment, j’ai installé sur mon serveur StatusNet, le moteur de microblogging libre, utilisé notamment par Identi.ca. Dans l’ensemble, l’installation est bien documentée dans le README. Un fichier htaccess d’exemple est présent contenant les règles de réécriture d’URL. Si vous utilisez Apache, pas de problème, renommez le fichier en .htaccess et c’est parti. Seulement, si on utilise un autre serveur web, il faudra adapter ces règles à la syntaxe de son serveur. Voici comment faire avec Lighttpd.
Fichiers de configuration
Un petit rappel du contenu du htaccess de StatusNet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <IfModule mod_rewrite.c> RewriteEngine On # NOTE: change this to your actual StatusNet base URL path, # minus the domain part: # # http://example.com/ => / # http://example.com/mublog/ => /mublog/ # RewriteBase /mublog/ ## Uncomment these if having trouble with API authentication ## when PHP is running in CGI or FastCGI mode. # #RewriteCond %{HTTP:Authorization} ^(.*) #RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php?p=$1 [L,QSA] </IfModule> |
Et voici son adaptation à la sauce lighty :
1 2 3 4 5 6 | # Si mod_rewrite n'est pas activé, on l'active server.modules += ( "mod_rewrite" ) # Équivalent de RewriteBase base_url = "/" # La règle de redirection url.rewrite-if-not-file = ( "^" + base_url + "(\w+)" => base_url + "index.php/$1" ) |
C’est plutôt… court
Explications
- Sous Lighttpd, il n’existe pas vraiment d’équivalent à RewriteBase, on utilise alors une simple variable, nommée ici base_url ;
- Conditions de réécriture : on utilise la directive url.rewrite-if-not-file. Cela a pour effet de réécrire seulement si l’URL pointe sur un fichier inexistant. Cependant, cela ne prend pas en compte les répertoires (pour remplacer RewriteCond %{REQUEST_FILENAME} !-d d’Apache).
C’est là que je me suis posé la question de la présence de cette directive dans le htaccess. Je ne vois vraiment aucun cas où l’application aurait besoin d’accéder (donc de lister) un répertoire. De toute manière, le dir-listing est désactivé par défaut, donc le problème est clos ; - Règle de réécriture et flags : Avant tout, on ne va pas s’embêter avec les paramètres GET dans l’URL, l’index.php permet convertir les URL du style /index.php/toto en /index.php?p=toto, et lighttpd le supporte.
La regex ne change pas vraiment, en revanche pour ce qui est des flags Apache : [L] permet d’arrêter le traitement de réécriture d’URL, c’est le comportement par défaut du coté de lighty (sinon on aurait utilisé url.rewrite-repeat-if-not-file). Pour le flag [QSA], qui permet de ne pas tronquer l’URL en cas de paramètres GET multiples, il ne sert à rien puisqu’on utilise pas ce genre d’URL (Sinon la réponse se trouve dans le second lien en fin d’article).
Liens utiles
[1] Apache mod_rewrite
[2] Adaptation des règles de rewrite Apache -> Lighttpd
[3] Lighttpd mod_rewrite
Sur le même sujet :


on utilise la directive url.rewrite-if-not-file
Cette directive n’est disponible qu’à partir de la version de la version 1.4.24 de lighttpd (mod_rewrite) pas encore disponible sous Debian Stable.
En attendant le fichier lighttpd.conf.example préconise :
server.error-handler-404 = "/index.php"C’est là que je me suis posé la question de la présence de cette directive dans le htaccess. Je ne vois vraiment aucun cas où l’application aurait besoin d’accéder (donc de lister) un répertoire. De toute manière, le dir-listing est désactivé par défaut, donc le problème est clos ;
Non pas lister mais accéder aux fichiers, par exemple les avatars ou les images d’arrière plan sont sur le système de fichier.
C’est juste ! Je n’y avais pas prêté attention car j’utilise la version testing (lighttpd 1.4.26).
Dans ce cas tu accèdes à un fichier
; si tu fais une requête sur /avatar/123.png par exemple, lighttpd testera si /avatar/123.png est un fichier, et c’est le cas. Il ne devrait jamais avoir à répondre à une requête sur /avatar/ par contre.