Le Redirect htaccess par la pratique

Le Redirect htaccess par la pratique

Difficulté

Apache

Redirection temporaire pour une maintenance ou une mise à jour…
Redirection définitive suite à une optimisation de référencement…

Voyons comment rediriger une page ou un répertoire d’un site vers une autre page ou un autre répertoire à l’aide de la directive apache Redirect gérée par le module mod_alias…

Il existe de nombreux tutoriaux à ce sujet, mais je n’en ai pas trouvé avec une liste d’exemples en fonction de ce qu’on veux rediriger.
J’ai donc fait un petit mémo utile quand on n’utilise pas ces directives apache tous les jours.

1. Le fichier htaccess

La redirection se fait par l’intermédiaire d’un fichier .htaccess (simple fichier texte), qu’Apache va lire et exécuter.
C’est un fichier « sensible ». La moindre erreur sur ce fichier engendrera une erreur 500 Internal Server Error.

Le fichier doit se situer de préférence à la racine du site , dans tous les cas au niveau ou en amont des fichiers/dossiers à rediriger.
On le créé avec un simple éditeur de texte.

A noter : Windows ne vous permettra pas d’enregistrer un fichier sans nom, il faudra passer par votre éditeur de texte préféré pour créer ce petit fichier.

2. Syntaxe de la redirection apache

Pour une redirection temporaire, les syntaxes suivantes sont équivalentes :
- Redirect temp
- RedirectTemp
- Redirect
- Redirect 302
…..

Pour une redirection définitive, les syntaxes suivantes sont équivalentes :
- Redirect permanent
- RedirectPermanent
- Redirect 301
…..

Et on poursuivra par
ancien_chemin http://nouveau chemin

Avec :
- Ancien chemin : pas de chemin relatif : quelque soit l’emplacement du htaccess, le chemin doit être un chemin absolu depuis la racine de votre site, et le fichier doit se situer au même niveau ou en aval du fichier htaccess.
- Nouveau chemin : l’URL http avec le nouveau chemin

3. En pratique :

Voyons plusieurs exemples de redirection temporaire (les règles sont les mêmes pour les redirections permanentes):

Redirection d’un fichier vers un autre :

Redirect temp /blog/repertoire/monfichier.php http://www.newsite.fr/monautrefichier.php

Url saisie        : http://www.anciensite.fr/blog/repertoire/monfichier.php redirigera vers
Url réécrite   : http://www.newsite.fr/monautrefichier.php

Redirection de tout un dossier vers un autre :

Redirect temp /blog/ http://www.newsite.fr/newrepertoire/

Url saisie        : http://www.anciensite.fr/blog/un/repertoire/loin/toutfichier.php redirigera vers
Url réécrite   : http://www.newsite.fr/newrepertoire/un/repertoire/loin/toutfichier.php

Redirection de tout un dossier vers une seule et même url :

RedirectMatch temp /.* http://www.newsite.fr/

Url saisie        : http://www.anciensite.fr/nimportequellearborescence/toutfichier.php redirigera vers
Url réécrite   : http://www.newsite.fr/

Redirection d’une url contenant des variables GET :

Redirect temp /blog/repertoire/monfichier.php http://www.newsite.fr/monautrefichier.php

En fait la directive est identique au premier exemple de redirection d’un fichier vers un autre :
Url saisie        : http://www.anciensite.fr/blog/repertoire/monfichier.php?var1=chapi&var2=chapo redirigera vers
Url réécrite   : http://www.newsite.fr/monautrefichier.php?var1=chapi&var2=chapo

Mais… Admettons que l’on veuille rediriger des pages contenant des variables dans l’url GET vers d’autres pages contenant d’autres variables GET (ou pas) ?
On aurait tendance à écrire :

Redirect temp /blog/repertoire/monfichier.php?nain=simplet http://www.newsite.fr/simplet.php
Redirect temp /blog/repertoire/monfichier.php?nain=prof http://www.newsite.fr/nain.php?lequel=prof

Sauf que cela ne fonctionne pas. Nous devrons obligatoirement passer par le module mod_rewrite d’Apache :

RewriteEngine On
RewriteCond %{REQUEST_URI} /blog/repertoire/monfichier.php$
RewriteCond %{QUERY_STRING} ^nain=simplet$
RewriteRule ^.*$ http://www.newsite.fr/simplet.php [L,R=302]

Le resultat de la réecriture sera dans ce cas : http://www.newsite.fr/simplet.php?nain=simplet

Mais ce n’est pas ce qu’on veut… Nous n’avons plus besoin de la variable GET.
Pour la supprimer, il suffit de terminer la chaine de substitution par un ? :

RewriteEngine On
RewriteCond %{REQUEST_URI} /blog/repertoire/monfichier.php$
RewriteCond %{QUERY_STRING} ^nain=simplet$
RewriteRule ^.*$ http://www.newsite.fr/simplet.php? [L,R=302]

Le resultat de la réecriture sera dans ce cas : http://www.newsite.fr/simplet.php

Et, pour la deuxième redirection

RewriteEngine On
RewriteCond %{REQUEST_URI} /blog/repertoire/monfichier.php$
RewriteCond %{QUERY_STRING} ^nain=prof$
RewriteRule ^.*$ http://www.newsite.fr/nain.php?lequel=prof [L,R=302]

Dans ces deux cas (vérifiez avant toute chose que mod_rewrite est activé sur votre serveur) :
- ligne1 : on active l’exécution du moteur de réécriture,
- ligne2 : condition de réécriture : l’uri demandée est /blog/repertoire/monfichier.php
- ligne3 : 2ème condition de réécriture : la requête en GET est nain=prof
- ligne4 : ^.*$ pour toute uri répondant aux 2 conditions précédentes, la requête sera redirigée vers http://www.newsite.fr/nain.php?lequel=prof.

En fin de directive, on trouvera les drapeaux de réécriture ou flag. Ils signifient pour L (last) d’arrêter ensuite la réécriture, et pour R=302, le type de redirection (dans notre cas temporaire donc 302)
Pour transmettre les variables GET de l’url demandée vers une url réécrite qui contient également des variables GET, il suffit d’ajouter le flag QSA.
L’url réécrite sera alors  http://www.newsite.fr/nain.php?lequel=prof&nain=prof

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>