TUTORIEL - Eviter les boucles de redirection

Consultez la formation au REFERENCEMENT naturel Google de WebRankInfo / Ranking Metrics

Giustino
WRInaute discret
WRInaute discret
 
Messages: 141
Enregistré le: 19 Nov 2011

TUTORIEL - Eviter les boucles de redirection

Message le Mer Sep 25, 2013 22:05

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
http://www.votresite.com/index.php?page=news&action=post

en
http://www.votresite.com/news/post

pour améliorer, notamment, le référencement.

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
http://www.votresite.com/news/post

pointe sur
index.php?page=news&action=post

sans oublier, bien entendu, d'interdire l'accès direct à
http://www.votresite.com/index.php?page=news&action=post


Vous seriez tenté d'écrire les règles suivantes:

Code: Tout sélectionner
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? :))

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: Tout sélectionner
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 !

Hafidov
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 1
Enregistré le: 19 Déc 2015

Re: TUTORIEL - Eviter les boucles de redirection

Message le Sam Déc 19, 2015 2:22

Bonjour Giustino,
Un excellent Tutoriel, je vous remercie bcp car il m'a été d'une grande utilité, alors que je tournais en rond depuis quelques jours et mes redirections des anciens urls vers les nouvelles donnaient lieu à des boucles de redirection :)
Je propose au passage à Olivier de mettre à jour le tutoriel qu'il avait consacré au URL Rewriting accessible sur la page : http://www.webrankinfo.com/dossiers/techniques/tutoriel-url-rewriting
Si on y intègre l'astuce pour éviter les boucles de redirection, ça va être un excellent topic sur la réécriture d'urls et une référence en la matière sur le web.
J'ai toutefois un petit problème que je n'arrive toujours pas à résoudre (mais j'ai réussi quand même pas mal d'urls réécrites),
Je souhaite réécrire l'url d'une page contenant un paramètre (cid), mais cette fois-ci afin que chaque valeur de paramètre pointe vers une url précise qui ne contient pas ce paramètre sous une quelconque forme mais contient juste l'appellation que je lui définis.
La réécriture est réussie (enfin je le pense) car la page est accessible via la nouvelle url, mais la redirection ne marche pas.
Voici un exemple d'url et la façon avec laquelle j'avais tenté réussir la réécriture et la redirection :

RewriteRule ^banque-et-finance$ /modules/wfdownloads/viewcat.php?cid=1 [E=BREAK:1,L]
RewriteCond %{ENV:REDIRECT_BREAK} !^1$
RewriteRule ^modules/wfdownloads/viewcat.php?cid=1$ /banque-et-finance [R=301,L]


Je compte sur vos lumières pour réussir la redirection également et je vous remercie bcp pour votre soutien et disponibilité.
Mes salutations cordiales.

Giustino
WRInaute discret
WRInaute discret
 
Messages: 141
Enregistré le: 19 Nov 2011

Re: TUTORIEL - Eviter les boucles de redirection

Message le Sam Déc 19, 2015 23:05

Bonjour Hafidov,

Ce tutoriel date d'il y a 2 ans, et bien que cette technique fonctionne toujours correctement, il y a en fait une manière moins "bricolage" d'y parvenir grâce à THE_REQUEST. Je ne peux malheureusement pas modifier mon tutoriel donc je vais le faire dans ce commentaire.

Pour reprendre mon exemple dans le tutoriel, le code serait désormais:
Code: Tout sélectionner
RewriteCond %{THE_REQUEST} \s/index\.php\?page=([^&\s]+)&action=([^&\s]+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/([^/]+)$ /index.php?page=$1&action=$2 [L]


Par rapport à votre problème, si j'ai bien compris selon votre code, vous désirez que l'url /banque-et-finance affiche le contenu de /modules/wfdownloads/viewcat.php?cid=1. Votre code est presque correct, mais la partie cid=1 fait partie de QUERY_STRING et n'est donc pas détectable directement dans RewriteRule. Voici la version corrigée:

Code: Tout sélectionner
RewriteRule ^banque-et-finance$ /modules/wfdownloads/viewcat.php?cid=1 [E=BREAK:1,L]

RewriteCond %{ENV:REDIRECT_BREAK} !^1$
RewriteCond %{QUERY_STRING} ^cid=1$ [NC]
RewriteRule ^modules/wfdownloads/viewcat\.php$ /banque-et-finance? [R=301,L]


Voici également, si vous le désirez, l'équivalent avec la nouvelle technique:

Code: Tout sélectionner
RewriteCond %{THE_REQUEST} \s/modules/wfdownloads/viewcat\.php\?cid=1\s [NC]
RewriteRule ^ /banque-et-finance? [R=301,L]

RewriteRule ^banque-et-finance$ /modules/wfdownloads/viewcat.php?cid=1 [L]


Formation recommandée sur ce thème :

Formation REFERENCEMENT naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :