Redirection htaccess : empêcher une boucle de redirection

23 Jan

Vous vous êtes surement déjà posé la question de savoir « comment rediriger une url virtuelle » vers une « url réelle » ? (le tout en php)
Rien de plus simple, il suffit d’utiliser un fichier .htaccess que vous uploader sur votre serveur.
Vous le savez surement déjà si vous êtes là.

Mon problème a été tout autre, et j’ai lutté pour trouver une solution, si bien que je me suis dit : pourquoi ne pas en faire un article afin de permettre aux gens de peut-être trouver plus facilement que moi.

Bref :

J’étais dans un cas particulier, j’avais donc 6 fichiers physiques, référencés tel quel : (donc impossible de simplement les renommer ou les déplacer)
/conseils.php
/conseils-formations.php
/conseils-couts.php
/entretiens-blabla.php
/entretiens-motivation.php
/entretiens.php

Et après quelques recherches et prises de conseils autour du référencement du site en question, il est apparu qu’une arborescence serait un plus.
Donc l’objectif était simple :
créer des sous dossiers « virtuels », sans modifier mon architecture physique de fichiers et obtenir :
/conseils/
/conseils/formations.php
/conseils/couts.php
/entretiens/
/entretiens/blabla.php
/entretiens/motivation.php

Rien de plus simple me direz vous :
Il suffit en effet (enfin je pensais) de 6 règles comme celles-ci :

RewriteRule ^conseils/$ /conseils.php [QSA,L,NC]
RewriteRule ^conseils/formations.php$ /conseils-formations.php [QSA,L,NC]

Et en prime de rediriger les anciennes comme ceci :

Redirect 301 conseils.php http://www.monsiteweb.com/conseils/
Redirect 301 conseils-formations.php http://www.monsiteweb.com/conseils/formations.php

Et le tour serait jouer…
Mais en fait non…
Et j’ai mis un certain temps à comprendre d’où venait les problèmes.

 

Bon, autant les redirections 301, ça va, ça a marché.
Les problèmes étaient tout autre, ainsi lorsque j’ai modifié :

RewriteRule ^conseils/$ test.php [QSA,L,NC]

Mon fichier continuait d’afficher conseils.php !
Première prise de conscience : ma règle n’est pas prise en compte me dis-je. Je m’agite en demandant si mon htaccess mets du temps à se rafraîchir, mais non. Rien.

En fait, le serveur sur lequel j’étais, « auto complétait » les extensions !
Ainsi, j’aurai pu avoir n’importe quelle extension (ainsi qu’une absence d’extension) c’était pareil.
Du coup dans un premier temps, j’ai du désactiver cette « autocomplétion des extensions » via htaccess :

Options -Multiviews

Bon, second problème après avoir rajouté ça et ma règle :

RewriteRule ^conseils/$ conseils.php [QSA,L,NC]

Je récupérais une charmante erreur :

« Cette page Web présente une boucle de redirection.
La page Web à l’adresse http://www.monsiteweb.com/conseils/ a déclenché trop de redirections. Pour résoudre le problème, effacez les cookies de ce site ou autorisez les cookies tiers. Si le problème persiste, il peut être dû à une mauvaise configuration du serveur et n’être aucunement lié à votre ordinateur. »

 

En fait, ma règle était en conflit avec ma redirection 301.
En gros, je redirigeais vers un fichier qui lui même redirigeait vers ma nouvelle url qui redirigeait vers mon fichier etc. : une jolie boucle en somme.

 

 

J’ai essayé un certain nombre de choses dont : [QSA,L,NC,S=15] (avec justement ce S=15 qui d’après ce que j’ai compris, permettait de sauter les 15 lignes suivantes et donc de ne pas tenir compte de ma règle en conflit. Sauf que ben en fait non. Rien à faire.

J’ai cherché et j’ai fini par trouver le précieux sésame !

RewriteCond %{QUERY_STRING} !stop

Ainsi, j’ai donc 2 règles : ma redirection 301 et mon rewriting de répertoire virtuel :
Mon rewriting de répertoire virtuel :
RewriteRule ^conseils/ /conseils.php?=stop [QSA,L,NC,S=15]

et ma redirection 301 :
RewriteCond %{QUERY_STRING} !stop
RewriteRule conseils.php http://www.monsiteweb.com/conseils/ [r=301,L,nc]
En résumé, la première est une règle d’url rewriting, qui rajoute un paramètre à l’url, et dans la redirection 301, on ajoute une condition pour ne pas rediriger si on a « stop » dans l’url.

 


(il y a surement des méthodes plus simples, mais j’étais sur un hébergement mutualisé, sans accès admin au serveur pour le bidouiller, et je n’y connaissais absolument rien donc c’est ce qui m’a paru le plus simple)

 

Bref, si jamais vous trouvez ça utile, n’hésitez pas à le dire, ça m’incitera à parler des futures problèmes que je rencontrerai. Et du coup qui sait : à vous servir une autre fois.

 

Source d’origine : http://forum.webrankinfo.com/redirection-pour-eviter-des-doublons-t88545.html


4 Réponses pour “Redirection htaccess : empêcher une boucle de redirection”


  1. Fatal error: Uncaught Error: Call to undefined function ereg() in /home/users7/f/fki8658/www/WordPress/Paul.mouzet.com/wp-content/themes/bueno/includes/theme-comments.php:66 Stack trace: #0 /home/users7/f/fki8658/www/WordPress/Paul.mouzet.com/wp-content/themes/bueno/includes/theme-comments.php(20): the_commenter_link() #1 /home/users7/f/fki8658/www/WordPress/Paul.mouzet.com/wp-includes/class-walker-comment.php(184): custom_comment(Object(WP_Comment), Array, 1) #2 /home/users7/f/fki8658/www/WordPress/Paul.mouzet.com/wp-includes/class-wp-walker.php(146): Walker_Comment->start_el('', Object(WP_Comment), 1, Array) #3 /home/users7/f/fki8658/www/WordPress/Paul.mouzet.com/wp-includes/class-walker-comment.php(139): Walker->display_element(Object(WP_Comment), Array, '5', 0, Array, '') #4 /home/users7/f/fki8658/www/WordPress/Paul.mouzet.com/wp-includes/class-wp-walker.php(389): Walker_Comment->display_element(Object(WP_Comment), Array, '5', 0, Array, '') #5 /home/users7/f/fki8658/www/WordPress/Paul.mouzet.com/wp-includes/comment-te in /home/users7/f/fki8658/www/WordPress/Paul.mouzet.com/wp-content/themes/bueno/includes/theme-comments.php on line 66