Suite à la récurrence de ce problème dans bon nombre de sujets postés, voici un petit tutoriel pour vous éviter de chercher une solution miracle pendant des heures.
Contexte:
Votre site possède des urls identiques à fichier.php?arg1=val1&arg2=val&... (par exemple)
Vous en avez marre et décidez, pour une raison d'optimisation de référencement (ou pour une autre d'ailleurs...), de réécrire ces urls vraiment affreuses en des urls bien structurées et SEO-friendly.
But de la démarche:
Réécrire, par exemple
Problématique:
S'il est aisé d'écrire une règle pour faire pointer l'url réécrite (la nouvelle) vers l'ancienne url, il faut néanmoins penser à interdire l'accès direct à l'ancienne url.
Ah bon? Et pourquoi?
Dans l'unique but d'éviter le fameux et tant détesté Duplicate Content !
En effet, si vous autorisez l'accès à un même contenu par plusieurs urls alors votre référencement risque d'en prendre un coup car Google n'aime pas ça.
Solution:
Reprenons l'exemple plus haut... On voudrait que l'url
Vous seriez tenté d'écrire les règles suivantes:
C'est en partie correct. Avec ce code, on obtient une belle boucle de redirection car l'un pointe sur l'autre qui lui même redirige vers le premier (vous voyez clairement la boucle se dessiner non?
)
Comment s'en sortir alors ?
L'astuce consiste à faire comprendre au serveur la différence entre une url réécrite par lui-même et une ancienne url accédée directement par l'utilisateur.
Et voilà le travail ! Grâce à l'utilisation d'une variable d'environnement que l'on crée, le serveur sait maintenant faire la distinction entre les 2 cas !
Bien sur, cette solution peut s'adapter à toutes sortes de cas.
En espérant que ça aide pas mal de gens !
Contexte:
Votre site possède des urls identiques à fichier.php?arg1=val1&arg2=val&... (par exemple)
Vous en avez marre et décidez, pour une raison d'optimisation de référencement (ou pour une autre d'ailleurs...), de réécrire ces urls vraiment affreuses en des urls bien structurées et SEO-friendly.
But de la démarche:
Réécrire, par exemple
enhttp://www.votresite.com/index.php?page=news&action=post
pour améliorer, notamment, le référencement.http://www.votresite.com/news/post
Problématique:
S'il est aisé d'écrire une règle pour faire pointer l'url réécrite (la nouvelle) vers l'ancienne url, il faut néanmoins penser à interdire l'accès direct à l'ancienne url.
Ah bon? Et pourquoi?
Dans l'unique but d'éviter le fameux et tant détesté Duplicate Content !
En effet, si vous autorisez l'accès à un même contenu par plusieurs urls alors votre référencement risque d'en prendre un coup car Google n'aime pas ça.
Solution:
Reprenons l'exemple plus haut... On voudrait que l'url
pointe surhttp://www.votresite.com/news/post
sans oublier, bien entendu, d'interdire l'accès direct àindex.php?page=news&action=post
http://www.votresite.com/index.php?page=news&action=post
Vous seriez tenté d'écrire les règles suivantes:
Code:
RewriteEngine on
RewriteRule ^(.*)/(.*)$ index.php?page=$1&action=$2 [L]
RewriteCond %{QUERY_STRING} ^page=(.*)&action=(.*)$
RewriteRule ^index.php$ %1/%2? [R=301,L]
C'est en partie correct. Avec ce code, on obtient une belle boucle de redirection car l'un pointe sur l'autre qui lui même redirige vers le premier (vous voyez clairement la boucle se dessiner non?
![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
Comment s'en sortir alors ?
L'astuce consiste à faire comprendre au serveur la différence entre une url réécrite par lui-même et une ancienne url accédée directement par l'utilisateur.
Code:
RewriteEngine on
RewriteRule ^(.*)/(.*)$ index.php?page=$1&action=$2 [E=BREAK:1,L]
RewriteCond %{ENV:REDIRECT_BREAK} !^1$
RewriteCond %{QUERY_STRING} ^page=(.*)&action=(.*)$
RewriteRule ^index.php$ %1/%2? [R=301,L]
Et voilà le travail ! Grâce à l'utilisation d'une variable d'environnement que l'on crée, le serveur sait maintenant faire la distinction entre les 2 cas !
Bien sur, cette solution peut s'adapter à toutes sortes de cas.
En espérant que ça aide pas mal de gens !