Charger le module mod_rewrite.so

Premièrement il faut s'assurer que le module est bien chargé dans le fichier httpd.conf.

Voici les emplacements de mes fichiers:

  • /etc/httpd/conf/httpd.conf
  • /usr/lib/httpd/modules/mod_rewrite.so
  • /var/www/ (répertoire qui correspond à la racine de mon site Web)

Dans le fichier httpd.conf, il faut charger le module mod_rewrite.so avec cette ligne:
LoadModule rewrite_module modules/mod_rewrite.so

Sur certains version de PHP/Apache, on peut s'assurer que le module est chargé à l'aide de la commande <?php phpinfo(); ?> de PHP. Il suffit d'écrire cette commande dans un fichier et de rechercher la section Apache.

Écrire des règles dans le fichier httpd.conf

Voici un exemple de syntaxe dans le fichier httpd.conf

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^/a/([a-z0-9_]+)$ /var/www/contenu/index.php?key=$1
    RewriteRule ^/xhtml/([A-Za-z0-9]+)$ /var/www/contenu/20/xhtml/index.php?tagname=$1
</IfModule>

Explications

  1. Le bloc <IfModule mod_rewrite.c> </IfModule> test si le module mod_rewrite.so est chargé. S'il est chargé, les commandes à l'intérieur sont exécutées.
  2. RewriteEngine on active les règles de réécriture. Il doit être présent pour que les règles fonctionnent.
  3. On peut écrire une ou plusieurs règles de réécriture.
  4. Après le mot-clé RewriteRule on écrit l'expression régulière qui sélectionnera l'URL. Ensuite on écrit le chemin complet du fichier cible (en débutant par la racine de l'ordinateur et non pas du serveur Web).
  5. Voici quelques informations sur les deux expressions régulières utilisées:
    ^
    L'URL doit commencer par ce qui suit
    $
    L'URL doit finir par ce qui précède.
    /a/ ou /xhtml/
    chaîne de caractères /a/ ou /xhtml/ (correspond donc à un répertoire)
    ([a-z0-9_]+)
    la chaîne de caractères doit contenir des caractères alphanumériques ou des _ (soulignés).
    ()
    limiteur. Permet de limiter des fragments utiles pour la redirection. Chaque () est associé à un numéro qui sera utilisé dans l'adresse du fichier cible. La première paire de parenthèses () correspond à $1, la deuxième correspond à $2, ...
    /var/www/contenu/index.php?key=$1
    Adresse du fichier cible. L'adresse est complète et débute à la racine de l'ordinateur. le $1 correspond à l'expression inscrite dans le limiteur ()
  6. S'il n'y pas pas de concordance avec l'expression régulière, la redirection ne se fera pas.

.htaccess

Presque les mêmes règles s'appliquent dans le fichier .htaccess.

Cependant, comme me la fait remarquer mon ami Stati[X], il ne faut pas utilisé le / de la racine dans les expressions régulières lorsque la règle est dans un fichier .htaccess. De plus, les expressions régulières sont formés à partir du chemin du répertoire du fichier .htaccess.

Exemple de structure:

/index.php (racine)
/test/
/test/.htaccess ( les règles sont inscrites ici )
/test/index.php

Fichier .htaccess

RewriteEngine On
RewriteRule  ^sousrepertoire/([0-9]+)\.html$ /var/www/test/index.php?key=$1

L'adresse /test/sousrepertoire/10.html sera redirigé vers la page /test/index.php?key=10. Remarqué que même si j'emploie le caractère ^ au tout début, sousrepertoire doit être après le répertoire /test/.

Ajouter des conditions?

2004/05/23 03:49

Mon ami était bien content de cette technique. Cependant, il voulait exclure un répertoire, il avait cette chaîne dans un fichier .htaccess à la racine de son serveur Web:

RewriteRule ^([a-z]+)/(([a-z]+)/([a-z0-9=&]*))?$  /home/test/public_html/index.php?cat=$1&id=$3&$4

Cette chaîne permet de retranscrire: /rep/5/var3&test=4 en /index.php?cat=rep&id=5&var3&test=4. Cependant, comment exclure un seul répertoire, /prive/ par exemple, d'utiliser cette redirection? Nous sommes arrivés à trouver cette solution:

RewriteCond   %{REQUEST_URI}  !prive/.*

On écrit la commande RewriteCond juste avant la commande RewriteRule. Elle indique qu'il ne faut pas que notre URI débute par prive/. Le fichier .htaccess ressemble donc à:

RewriteEngine On
RewriteCond   %{REQUEST_URI}  !prive/.*
RewriteRule ^([a-z]+)/(([a-z]+)/([a-z0-9=&]*))?$  /home/test/public_html/index.php?cat=$1&id=$3&$4

Hyperliens...