url rewriting redirection 301

Le principe de l'url rewriting ou bien encore réecriture d'url est d'utiliser le moteur apache de votre serveur pour changer la forme des url. Il faut vérifier que ce module est implanté et activé. Par exemple cela ne marche pas chez free.

Pour faire une redirection il suffit de créer un fichier .htaccess que l'on met à la racine de son serveur, de ce type :


Options +FollowSymlinks
RewriteEngine on
RewriteRule ancienne-page.html nouvelle-page.html [L]


ainsi ancienne-page.html sera redirigée vers nouvelle-page.html. Le flag [L] (last) veut dire dernière règle, autrement dit la réecriture de ancienne-page.html s'arrête là. Ce drapeau est important pour qu'il n'y ai pas de boucle sans fin lorsqu'il y a de nombreuses règles.

Attention chez OVH - règles spécifiques
Pour les hébergments mutualisés OVH, il faut donner un chemin absolu pour le second argument. Cela devient donc /trouve.html

redirection 301

Lorsqu'une page est déplacé définitivement ou bien si vous avez changé de nom de domaine, il convient de faire une redirection 301. Les moteurs de recherche transmettent ainsi les propriétés de l'ancienne mpage à la nouvelle (PR, classement, indexation etc. )
Par exemple pour rediriger toutes les pages de domaine.com vers nouveau-domaine.com il suffit de placer la règle suivante a la racine de l'ancien domaine :

RewriteRule (.*) http://www.nouveau-domaine.com/$1 [QSA,R=301,L]

[QSA] Query String Append. Rajoute le QUERY_STRING à la fin de l’expression, après la réécriture. A réserver pour la dernière règle de réécriture. Utilisée le plus souvent avec le flag [L], comme dans [QSA,L]
[R=code] Si vous souhaitez faire savoir au navigateur/robot qu’une page a été remplacée définitivement, utiliser le code 301 comme dans : RewriteRule ^ancien\.html$ http://domaine.tld/nouveau.html [R=301,L] Si l’argument code n’est pas précisé, une redirection 302 (déplacé temporairement) est effectuée.

Autres Flags


[NC] NoCase, ou « insensible à la casse ». La règle suivante :
RewriteRule ^page\.php$ nouvellepage.php [NC,L]
S’appliquera aussi bien à script page.php, PAGE.php ou PaGe .PhP

Les réécritures conditionnelles

Dans les exemples qui précèdent, nous avons vu des règles s’appliquant indépendamment du navigateur, de l’adresse IP ou du domaine émettant la requête. Nous allons maintenant voir des rêgles de réécriture sous conditions.
Une page d’accueil différente selon le navigateur

RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /mozilla.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^/$ /lynx.html [L]
RewriteRule ^/$ /standard.html [L]

Un nouveau mot-clé fait son apparition ici : "RewriteCond" ou "condition de réécriture".
La syntaxe est simple et de la forme : RewriteCond variable_testée valeur_de_comparaison

Dans l’exemple, testons si l’identifiant du navigateur (%{HTTP_USER_AGENT}) commence par Mozilla (^Mozilla) et est suivi par une chaîne quelconque. (.*) Si cette règle est vraie, nous réécrivons le répertoire racine du site(^/$ signifie "début de ligne/fin de ligne" ou simplement / seul sur la ligne)) en page "mozilla.html" et arrêtons nos réécritures [L] Procédons de meme pour Lynx, qui se satisfera d’une page lynx, si aucune des 2 règles précédentes ne s’applique, soit pour tous les autres navigateurs, redirigons les vers notre page "standard.html"

Quelques expressions régulières à connaître :

. n’importe quel caractère
[abcd] n’importe lequel de cette liste de caractères
[^abcd] tout caractère non compris dans la liste (autre que a, b, c ou d)
blanc|noir alternative, soit « blanc », soit « noir »
+ Une ou N occurrence(s) de l’expression qui précède (N > 1)
[0-9]+ Indique que la variable est composée d'un ou plusieurs chiffres.
* Zéro ou N occurrence(s) de l’expression qui précède (N>0)
(texte) Groupement permettant l’utilisation des références inverses ($1,... $n) . Est aussi utilisé pour délimiter une alternative comme (blanc|noir). Les parenthèses servent à encadrer une variable dont la valeur est récupérée dans la 2ème partie de la rêgle $1,$2 etc ....
^ Ancre de début de ligne. Indique le début de l'URL à récrire. Ce caractère est facultatif mais il est plus rigoureux de l'utiliser.
$ Ancre de fin de ligne. Indique la fin de l'URL à réécrire. Ce caractère est facultatif mais il est plus rigoureux de l'utiliser.
\ permet d’échapper tout caractère qui suit et lui ôter sa signification particulière, par exemple \.

Quelques exemples :

- Transformer article-3.php en son url exacte (celle du CMS par ex) : article.php?id=3 :

RewriteRule ^article-3\.php$ /article.php?id=3 [L]


- Transformer toutes les url de la forme article-x.php ou x est un nombre en article.php?id=x :

RewriteRule ^article-([0-9]*)\.php$ /article.php?id=$1 [L]


- rediriger domaine.com vers www.domaine.com

RewriteCond %{HTTP_HOST} ^domaine\.com$ [NC] RewriteRule ^(.*) http://www.domaine.com/$1 [QSA,L,R=301]


- rediriger article-15-3.html vers article.php?id=15&rubrique=3 marche quels que soient les numéros

RewriteRule ^article-([0-9]+)-([0-9]+)\.html$ /article.php?id=$1&rubrique=$2 [L]


- rediriger article-33-6-3.html vers article.php?id=33&page=6&rubrique=3 . marche quels que soient les numéros

RewriteRule ^article-([0-9]+)-([0-9]+)-([0-9]+).html /article.php?id=$1&page=$2&rubrique=$3 [L]


régles utiles du htaccess


- Rediriger les visiteurs de votre site lorsque vous êtes en pleine maintenance

Cela permet d’envoyer votre trafic vers une page ou un site de votre choix pendant que vous êtes en train de faire des mises à jours.

order deny,allow
deny from all
allow from 111.111.111.111
ErrorDocument 403 /page.html
allow from all

Pensez à remplacer l’adresse ip 111.111.111.111 par votre adresse ip. Remplacer aussi page.html par la page que vous voulez que les internautes voient lors de la redirection.

- Afficher une page d’erreur 404 personnalisée
Si votre serveur affiche une page de type « Erreur 404, fichier non trouvé », cela veut dire que vous essayez d’accèder à quelque chose qui n’existe pas sur votre serveur. Vous pouvez évidement remplacer cette page par défaut par la votre et la personnaliser comme bon vous semble en ajoutant ceci dans votre htaccess.
ErrorDocument 404 /404.html

Remplacer 404.html par la page d’erreur personnalisée que vous voulez afficher.

- Empêcher le listing de vos répertoire
Par défaut sous Apache, lorsqu’il n’y a pas de page d’index, ce qu’on voit dans son navigateur, c’est la liste des fichiers et des répertoires contenu sur votre serveur. Gênant n’est ce pas ? Si c’est le cas de votre serveur et si vous voulez empêcher cela, il faut rajouter l’option suivante dans votre .htaccess.

Options All -Indexes