We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 23050
    • 1,842 Posts
    Bonjour tout le monde,

    Je souhaite rediriger

    -http://www.deco-in.com/annuaire/architectes/?ditto_filter=dpt,31,1
    vers
    -http://www.deco-in.com/annuaire/architectes?ditto_listepros_filter=dpt,31,1

    J’ai essayé une règle classique que j’utilise déjà pour d’autres documents MODx (mais sans paramètre de Ditto) mais ça ne marche pas

    RewriteRule annuaire/architectes/?ditto_filter=dpt,31,1 http://www.deco-in.com/annuaire/architectes/?ditto_listepros_filter=dpt,31,1 [L,NC,R=301]


    Je me dis que c’est le paramètre Ditto qui me met dedans, mais je ne sais pas comment faire autrement grin

    Quelqu’un a été confronté à ce problème ? Merci smiley
      • 27582
      • 57 Posts
      Salut,

      Ton problème c’est que la clause [tt]RewriteRule[/tt] ne prend pas en compte la query string de l’url source (ce qui se trouve après le ? ). Le seul moyen d’y accéder, c’est au travers d’une clause [tt]RewriteCond[/tt].

      Il faut donc que tu ré-écrives ta règle sous la forme suivante:
      RewriteCond ${QUERY_STRING} ^ditto_filter=dpt,31,1$
      RewriteRule http://www.deco-in.com/annuaire/architectes/ http://www.deco-in.com/annuaire/architectes?ditto_listepros_filter=dpt,31,1 [L,NC,R=301]
      


      Bon, je ne garanti pas le fonctionnement du premier coup du code ci-dessus - je ne l’ai pas testé embarrassed . Mais c’est l’idée.

      A+,
      Sylvain
        Jeune dipl
        • 23050
        • 1,842 Posts
        Désolée pour le retard dans la réponse, je savais que ce problème allait me demander toute ma concentration, donc j’ai attendu le meilleur moment pour m’y coller :p

        Ta réécriture ne fonctionne pas mais voici ce à quoi je suis arrivée suite à la lecture de
        - http://www.sophiemenart.info/?post/05/12/2006/Redirection-durls-en-Query-String-de-DC1-a-DC2-chez-OVH et
        - http://www.webmaster-hub.com/publication/Mod-rewrite-ou-la-reecriture-des.html

        RewriteCond %{QUERY_STRING} ^ditto_filter=dpt,([0-9]{2}),1$
        RewriteRule annuaire/architectes/ http://www.deco-in.com/annuaire/architectes?ditto_listepros_filter=dpt,%1,1 [L,NC,R=301]


        (L’avantage ici c’est que je ne n’ai pas à me taper les quelques 100 départements puisque la variable %1 les gère tous)

        J’ai naturellement voulu ajouter une 2ème RewriteRule pour traiter les décorateurs de mon annuaire... mais j’ai une erreur : la variable %1 n’est pas ajoutée dans l’url de la 2ème RewriteRule, ça me renvoie ?ditto_listepros_filter=dpt,,1 (manque le département)

        J’en conclue qu’une RewriteRule peut avoir plusieurs RewriteCond (au vu des exemples vus sur le net)... mais une RewriteCond ne peut avoir qu’une unique RewriteRule ? Est-ce que je dois alors répéter ma RewriteCond autant de fois que j’ai de rubriques dans l’annuaire ? Même si la RewriteCond est strictement identique ?

        Merci smiley
          • 23050
          • 1,842 Posts
          La solution serait de pouvoir passer la rubrique de l’annuaire en variable aussi.

          J’ai donc tenté un

          RewriteCond %{QUERY_STRING} ^ditto_filter=dpt,([0-9]{2}),1$
          RewriteCond %{QUERY_STRING} ^annuaire/(.+)/$
          RewriteRule annuaire/ http://www.deco-in.com/annuaire/%2/?ditto_listepros_filter=dpt,%1,1 [L,NC,R=301]


          Sans succès :/
          En fait, l’url n’est pas réécrite donc je pense que mon 2ème RewriteCond n’est pas traité
            • 27582
            • 57 Posts
            Salut,

            Le code:
            RewriteCond %{QUERY_STRING} ^annuaire/(.+)/$

            ne peut pas fonctionner parce-que ne n’est pas ta query string qui correspond à l’expression régulière [tt]^annuaire/(.+)/$[/tt], mais plutôt l’url. Or pour faire un test sur l’URL, [tt]RewriteRule[/tt] fait parfaitement l’affaire.

            Pourquoi ne pas simplement tenter:
            RewriteCond %{QUERY_STRING} ^ditto_filter=dpt,([0-9]{2}),1$
            RewriteRule annuaire/([a-z]*)/ http://www.deco-in.com/annuaire/%2?ditto_listepros_filter=dpt,%1,1 [L,NC,R=301]
            

            Là, le [tt]RewriteCond[/tt] fait un test conditionnel sur la query string et initialise au passage la variable [tt]%1[/tt]. Ensuite le [tt]RewriteRule[/tt] fait comme d’habitude un test sur le chemin de l’URL et initialise au passage [tt]%2[/tt] à ce qui se trouve après /annuaire/ (j’ai mis [tt]([a-z]*)[/tt] en imaginant que la rubrique est identifiée par un mot composé de lettre de a à z, mais je te fait confiance pour trouver une expression régulière plus adaptée si nécessaire;) )

            Comme l’autre jour, le code n’est pas garanti, mais d’après ce que j’ai vérifié sur http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html à quelques modifications près, ça devrait fonctionner...

            J’espère t’avoir un tant soit peu aidé,
            A+,
            Sylvain
              Jeune dipl
              • 23050
              • 1,842 Posts
              Ok, je crois comprendre le pourquoi du comment laugh

              Cela dit, j’ai testé ta méthode et le RewriteRule "mange" le nom de ma rubrique... du coup, je suis redirigée sur /annuaire/?ditto... et je perds /architectes/

              En plus, j’ai pas trouvé comment ajouter le caractère "-" dans l’expression régulière... j’ai pas trop l’habitude de manipuler ces expressions ^^
                • 27582
                • 57 Posts
                Tu travailles tard!

                Bon, c’est vrai que ces histoire des ré-écriture d’URL c’est assez piègeur. donc, j’ai vérifié dans la doc et cette fois ci, j’ai testé:

                Voici mon [tt].htaccess[/tt]:
                RewriteEngine On
                
                RewriteCond %{QUERY_STRING} ^ditto_filter=dpt,([0-9]{2}),1$
                RewriteRule annuaire/([a-z]+)/ http://www.deco-in.com/annuaire/$1?ditto_listepros_filter=dpt,%1,1 [L,NC,R=301]
                


                Je l’ai mis dans un répertoire "bidon" sur mon hébergement: tu peux tester en te connectant sur http://www.esicom-st-malo.fr/httest/annuaire/architectes/?ditto_filter=dpt,31,1

                Normalement, tu seras redirigé sur http://www.deco-in.com/annuaire/architectes/?ditto_listepros_filter=dpt,31,1

                La seule modif qui a été nécessaire a été de remplacer dans la [tt]RewriteRule[/tt] le [tt]%2[/tt] par [tt]$1[/tt]. C’est une subtilité qui m’avait échappée, mais, pour citer la doc:
                Substitution of a rewriting rule is the string which is substituted for (or replaces) the original URL for which Pattern matched. Beside plain text you can use

                1. back-references $N to the RewriteRule pattern
                2. back-references %N to the last matched RewriteCond pattern
                3. server-variables as in rule condition test-strings (%{VARNAME})
                4. mapping-function calls (${mapname:key|default})
                Les motifs extrait d’une clause [tt]RewriteCond[/tt] sont accessible par des variables [tt]%N[/tt], et ceux extrait d’une [tt]RewriteRule[/tt] sont accessible par des variables [tt]$N[/tt]...
                  Jeune dipl
                  • 23050
                  • 1,842 Posts
                  Super ! J’ai testé sur Déco’In et ça marche ! Fallait le savoir cette histoire de $ !

                  Et tu as une idée pour intégrer le "-" dans l’expression régulière ? Je sèche, je suis pas à l’aise avec la syntaxe
                    • 27582
                    • 57 Posts
                    Oups, tu lis plus vite que je n’écris wink

                    Sinon, concernant les expressions régulières, pour ajouter le caractère "-" dans une classe de caractères (Character class: une suite de caractères entre crochets), il faut le placer en première position. Autrement, il définit un intervalle.
                    [a-z]        # correspond avec n'importe quel caractère entre 'a' et 'z'
                    [-a-z]       # correspond avec le '-' ou n'importe quel caractère entre 'a' et 'z'
                    


                    J’ai modifié mon .htaccess:
                    RewriteCond %{QUERY_STRING} ^ditto_filter=dpt,([0-9]{2}),1$
                    RewriteRule annuaire/([-a-z]+)/ http://www.deco-in.com/annuaire/$1?ditto_listepros_filter=dpt,%1,1 [L,NC,R=301]
                    


                    Teste ici: http://www.esicom-st-malo.fr/httest/annuaire/artistes-createurs/?ditto_filter=dpt,31,1
                      Jeune dipl
                      • 23050
                      • 1,842 Posts
                      Rha là là, super magique !!! Tout fonctionne wink

                      Merci infiniment, tes explications m’ont fait comprendre plein de trucs, j’ai passé un cap dans le domaine de la réécriture d’url lol ! kiss kiss