Skip to content

Url rewriting pour StatusNet sous Lighttpd

par billux le 2 août 2010
URL Rewriting

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 :D

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 :

  1. Lighttpd et encodage de fichiers texte
  2. Page de status de php-fpm et Lighttpd
  3. Utiliser AWStats sans CGI
2 Commentaires
  1. gege2061, le 3 août 2010 à 0 h 35 min (permalien)

    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.

  2. billux, le 3 août 2010 à 13 h 35 min (permalien)

    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.

    C’est juste ! Je n’y avais pas prêté attention car j’utilise la version testing (lighttpd 1.4.26).

    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.

    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.

Poster une réponse

NB : Le XHTML est autorisé. Votre adresse email ne sera jamais publiée ou partagée.

S'abonner au flux RSS des commentaires