Comment utiliser l'URL Rewriting

Présentation

L'URL Rewriting permet, comme son nom l'indique, de réécrire les URL. C'est un outil fondamental pour la création de vos sites internet. Il permet de simplifier et de rendre plus propre vos URL, améliorer le référencement, permettre l'évolution de votre site, ... C'est particulièrement utile sur vos pages dynamiques, qui prennent des paramètres :

1 http://mon-site.fr/blog.php?article_id=5

Pour les robots de référencement, ce n'est pas toujours facile de distinguer les paramètres à prendre en compte et ceux à ignorer. Votre URL pour vos utilisateurs pourrait alors devenir :

1 http://mon-site.fr/Blog-5/Comment-utiliser-l-URL-Rewriting

Cet outil s'occupera de faire le lien en interne entre votre URL "utilisateur" et votre URL "système". Un autre avantage est que lorsque vous mettrez à jour votre système et que vos URL devront changer, vous pourrez faire votre migration facilement et vos utilisateurs ne se rendront compte de rien.

1 Par exemple : http://mon-site.fr/Blog-5/Comment-utiliser-l-URL-Rewriting
2 Ne pointera plus sur : http://mon-site.fr/blog.php?article_id=5
3 Mais sur : http://mon-site.fr/index.php?page=blog&article_id=5

Mise en place

Pour utiliser ce système, vous devez utiliser Apache et avoir le module Rewrite d'installer. Vous devez donc ajouter dans votre .htaccess à la racine de votre site :

1 RewriteEngine on

Cela permet de démarrer le module de réécriture d'URL.

Règles de redirections

Pour faire une redirection d'une URL utilisateur vers une URL système, vous devez utiliser la commande RewriteRule :

1 RewriteRule [Regex URL] [Destination] [FLAGS]

Vous devez utiliser les expressions rationnelles pour faire matcher des URL :

1 ^Blog-([0-9]+)/([a-zA-Z0-9_-]+)$

Puis on définit une URL de destination, si l'URL matche. On peut bien entendu récupérer les variables de l'URL pour les envoyer en paramètres ($X récupérera le contenu de la Xième parenthèse) :

1 /index.php?page=blog&id=$1&name=$2

Nous verrons ce que sont les flags juste après. Voici ce que donne notre redirection :

1 RewriteRule ^Blog-([0-9]+)/([a-zA-Z0-9_-]+)$ /index.php?page=blog&id=$1&name=$2 [QSA,L,NC]

Conditions de redirections

Il est également possible d'ajouter des règles de redirections sous certaines conditions. Nous pourrions par exemple souhaiter rediriger le nom de domaine mon-site.fr vers www.mon-site.fr si ce n'est pas déjà le cas. Pour faire ces conditions, nous allons avoir besoin d'utiliser des variables prédéfinies. Quelques exemples :

  • HTTP_USER_AGENT : User Agent, chaîne de caractères décrivant le navigateur/OS utilisé par l'utilisateur
  • HTTP_REFERER : Lien de la page précédente, donc la source d'arrivée du client
  • HTTP_HOST : Nom de domaine utilisé
  • REMOTE_ADDR : Retourne l'IP de l'utilisateur
  • REQUEST_METHOD : Méthode de la requête (GET, POST, ...)
  • QUERY_STRING : Les paramètres de l'URL

Il existe encore pas mal d'autres variables, je vous ai donné ici celles qui me semblaient les plus utiles. Vous trouverez la liste complète sur le site officiel : http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond.

Grâce à ces variables, nous pouvons maintenant faire notre redirection si nous n'avons pas les "www" sur le nom de domaine :

1 RewriteCond %{HTTP_HOST} ^mon-site.fr$ [NC]
2 RewriteRule (.*) http://www.mon-site.fr/$1 [QSA,R=301,L]

Les flags

Voyons à présent l'utilité des flags ; j'en ai utilisé plusieurs depuis le début, il est temps que vous compreniez leurs utilités. Ces flags (drapeaux) sont des options possibles pour vos règles (ou conditions) de redirections d'URL.

[L] (Last)

Ce flag permet d'indiquer que si la règle match, on arrête ignore toutes les prochaines instructions.

Il est en effet possible de faire matcher l'URL courante sur plusieurs règles. Attention cependant à ne pas faire de boucle de réécriture.

[QSA] (Qsappend)

Le drapeau QSA indique au serveur de combiner les arguments fournis dans les URL. Exemple de règle de redirection :

1 RewriteRule ^Blog-([0-9]+)/([a-zA-Z0-9_-]+)$ /index.php?page=blog&id=$1&name=$2 [QSA,L,NC]

Avec l'URL :

1 /Blog-5/Comment-utiliser-l-URL-Rewriting?argument=toto

L'URL générée sera alors :

1 /index.php?page=blog&id=5&name=Comment-utiliser-l-URL-Rewriting&argument=toto

[R] (Redirect)

Provoquera une redirection sur la nouvelle URL. Il est par ailleurs possible de lui fournir le code HTTP de retour (par défaut à 302) : [R=301].

1 RewriteCond %{HTTP_HOST} ^mon-site.fr$ [NC]
2 RewriteRule (.*) http://www.mon-site.fr/$1 [QSA,R=301,L]

Cette règle redirigera donc l'URL avec le nom de domaine sans les www vers la même URL avec les www (en gardant son path et tous ces arguments). Le code de retour est important pour indiquer aux robots de référencements de quels types de redirections s'agit-il :

  • 301 : Redirection permanente
  • 302 : Page déplacée temporairement
  • 307 : Redirection temporaire

[NC] (Nocase)

Indique au serveur d'ignorer la case sur la réécriture, il ne fera donc pas de différence entre les majuscules et les minuscules.

[S] (Skip)

Ce flag permet d'ignorer les X prochaines règles. Les conditions de réécriture ne s'appliquant toujours qu'à la prochaine réécriture, vous pouvait utiliser ce flag pour appliquer la condition sur plusieurs règles à la fois :

1 RewriteCond %{HTTP_HOST} !^www.mon-site.fr$
2 RewriteRule .* - [S=3]
3 
4 RewriteRule ^apple-touch(.*).png$ /subdirectories/favicon.png [L]
5 RewriteRule ^favicon.ico$ /subdirectories/favicon.ico [L]
6 RewriteRule ^favicon.png$ /subdirectories/favicon.png [L]

Le remplacement - permet d'indiquer de ne pas modifier l'URL.

[OR] (Ornext)

Ce flag ne s'applique qu'aux conditions de redirections. Il permet de combiner plusieurs conditions :

1 RewriteCond %{HTTP_HOST} ^www.mon-site.fr$ [OR]
2 RewriteCond %{HTTP_HOST} ^localhost$
3 RewriteRule ...

Les autres flags

Vous trouverez la liste des autres flags sur le site officiel :


PHP URL Rewriting SEO

Article publié le 21 Mai 2014.

Commentaires