TUTORIEL - Eviter les boucles de redirection

Discussion dans 'URL Rewriting et .htaccess' créé par Giustino, 25 Septembre 2013.

  1. Giustino
    Giustino WRInaute discret
    Inscrit:
    19 Novembre 2011
    Messages:
    141
    J'aime reçus:
    0
    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
    en
    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
    pointe sur
    sans oublier, bien entendu, d'interdire l'accès direct à
    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? :))

    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 !
     
  2. Hafidov
    Hafidov Nouveau WRInaute
    Inscrit:
    19 Décembre 2015
    Messages:
    1
    J'aime reçus:
    0
    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 : https://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.
     
  3. Giustino
    Giustino WRInaute discret
    Inscrit:
    19 Novembre 2011
    Messages:
    141
    J'aime reçus:
    0
    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:
    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:
    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:
    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]
     
  4. jaiunwri
    jaiunwri Nouveau WRInaute
    Inscrit:
    25 Avril 2019
    Messages:
    1
    J'aime reçus:
    0
    Bonjour,

    J'ai réussi à faire ça, avant de voir que le code était à jour plus bas…
    Code:
    RewriteRule     ^foo/([a-z0-9]+)/?$       foo.php?id=$1 [E=BREAK:1,L]
    RewriteCond     %{ENV:REDIRECT_BREAK}     !^1$
    RewriteCond     %{QUERY_STRING}   ^id=([a-z0-9]+)$
    RewriteRule     ^foo.php$       foo/%1? [R=301,L]
    Mais là je sèche pour la version sans break :

    Code:
    RewriteCond %{QUERY_STRING} ^id=([a-z0-9]+)$ [NC]
    RewriteRule ^foo/%1/? [R=301,L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^foo/([a-z0-9]+)/$ foo.php?id=$1 [L]
    Une piste ?
     
  5. Giustino
    Giustino WRInaute discret
    Inscrit:
    19 Novembre 2011
    Messages:
    141
    J'aime reçus:
    0
    Voici la correction dans votre cas précis:

    Code:
    # Redirect /foo.php?id=XXX to /foo/XXX/
    RewriteCond %{THE_REQUEST} \s/foo\.php\?id=([a-z0-9]+)\s [NC]
    RewriteRule ^ /foo/%1/? [R=301,L]
    
    # Internally rewrite /foo/XXX/ to /foo.php?id=XXX
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^foo/([a-z0-9]+)/$ /foo.php?id=$1 [L]
    
     
  6. hgus
    hgus Nouveau WRInaute
    Inscrit:
    10 Mai 2010
    Messages:
    4
    J'aime reçus:
    0
    Bonjour, je ne sais pas si j'aurais du créer un nouveau topic pour ma question, mais le titre de celui-ci correspond à mon questionnement : comment éviter des boucles de redirection ...

    Car j'ai lu ci-et-là que si l'on créé des redirections 301 via htaccess depuis le même serveur vers le même serveur, ça va faire des boucles. A moins d'utiliser le mod-rewrite ce qui complexifie un peu l'écriture.

    Mais je me demande si dans mon cas, ... ce serait le cas ! ?
    Je m'explique :
    - je suis sur le point de migrer un site, changement de domaine (truc.fr vers truc.com)
    - et de serveur (dédié)
    - nouvelle structure de site, nouvelles urls
    - donc il change de serveur (nouvelle ip)
    - je souhaite résilier cash l'ancien dédié
    - rattacher l'ancien ndd truc.fr au nouveau serveur, en utilisant plesk, donc en déclarant un nouveau site (nouveau virtual host, donc pas le même que truc.com)
    - et sur l'espace alloué pour truc.fr, juste mettre un htaccess avec des redirections 301 vers truc.com, donc dans un autre vhost, ...
    Mais sur le même serveur, même @ip ... je me tors le cerveau peut-être pour rien, mais ne voulant pas faire de bêtise, c'est un site 'important', j'aurais voulu en être sûr ;)

    Est-ce que quelqu'un pourrait me conseiller sur ce cas de figure ?

    Merci beaucoup d'éclairer ma lanterne, et de vos conseils précieux !

    Salutations,
     
Chargement...
Similar Threads - TUTORIEL Eviter boucles Forum Date
Votre avis sur mon site de tutoriels www.tutovod.com Demandes d'avis et de conseils sur vos sites 14 Janvier 2019
Un tutoriel doubleclik-adsense ? AdSense 5 Avril 2016
Tutify.net - Astuces et tutoriels informatiques Demandes d'avis et de conseils sur vos sites 25 Mars 2016
Site et Chaîne de formations sous forme de tutoriels vidéo Demandes d'avis et de conseils sur vos sites 23 Mars 2016
Tuto-zone.com Blog de tutoriels Demandes d'avis et de conseils sur vos sites 15 Mars 2016
Tutoriel code/ prestashop Le café de WebRankInfo 28 Février 2016
tutoriel vidéo pour apprendre php Développement d'un site Web ou d'une appli mobile 26 Mars 2015
tutoriel en vidéo pour apprendre wordpress Développement d'un site Web ou d'une appli mobile 27 Juin 2014
Tutoriel : Installation manuelle de WordPress chez OVH Administration d'un site Web 15 Novembre 2013
Fabien-Créations - Site personnel et rédactions de tutoriels/Articles Demandes d'avis et de conseils sur vos sites 20 Août 2012
  1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
    Rejeter la notice