Partage
  • Partager sur Facebook
  • Partager sur Twitter

Url rewriting htaccess

Sujet résolu
    27 septembre 2018 à 21:18:36

    Bonjour à tous, 

    suite à des modifications des pages du site, et pour éviter que les liens référencés sur google n'amènent sur une erreur 404, je tente de rediriger les anciennes pages vers les nouvelles

    j'ai un petit soucis avec mes URL, j'ai mis dans mon htaccess

    RewriteEngine on
    RewriteRule ^poeme.php?id=([0-9]+)&cat=tdm$ tdmpoeme.php?id=$1 [L]
    
    

    afin que l'URL

    www.lespoetes.net/tdmpoeme.php?id=10240

    soit transformé en 

    www.lespoetes.net/poeme.php?id=10240&cat=tdm

    Mais il ne se passe rien...

    pourtant j'ai aussi mis une autre règle : 

    RewriteRule ^theme-(.+)\.html$ tdmtheme.php?theme=$1 [L]

    et celle là marche bien

    pour 

    www.lespoetes.net/theme-amour.html

    j'ai bien

    www.lespoetes.net/tdmtheme.php?theme=amour 

    qui est appelée

    Si quelqu'un voit mon erreur, je suis preneur

    • Partager sur Facebook
    • Partager sur Twitter
      27 septembre 2018 à 22:13:19

      Bonjour,

      ce n'est pas pareil, sur la première tu as tdm devant poeme.

      -
      Edité par philodick 27 septembre 2018 à 22:14:38

      • Partager sur Facebook
      • Partager sur Twitter
        27 septembre 2018 à 22:30:35

        Ca m'a l'air juste. Juste que ladite transformation n'est pas exprimée du point de vue du processus de réécriture mais de ses sources HTML, j'imagine, donc s'en trouve inversé. Mais j'ai peut être mal compris ...

        > Mais il ne se passe rien...

        Erreur classique : c'est normal, tu n'as pas compris le fonctionnement de RewriteRule : le motif testé par RewriteRule ne concerne que le chemin (en partie) d'une URL. Ca n'inclut pas la query string (la partie ?id=([0-9]+)&cat=tdm donc). Pour faire une condition sur cette dernière, il faut passer, comme pour toute autre partie de l'URL, par une ligne/directive RewriteCond et la variable appropriée (%{QUERY_STRING} ici).

        -
        Edité par julp 27 septembre 2018 à 22:36:42

        • Partager sur Facebook
        • Partager sur Twitter
          28 septembre 2018 à 9:39:25

          Merci JULP, 

          effectivement je n'avais rien compris.

          Donc pour reprendre.

          Si je veux transformer 

          www.lespoetes.net/tdmpoeme.php?id=10240

          en 

          www.lespoetes.net/poeme.php? id=10240&cat=tdm


          j'ai deux transformations à effectuer,

          - une avec RewriteRule qui doit transformer mon tdmpoeme.php en poeme.php

          - une avec RewriteCond qui doit récupérer mon id et réécrire ce qu'il y a après le point d'interrogation.


          Est-ce que ça pourrait donner cela ?

          RewriteCond%{QUERY_STRING} id=(.*)
          RewriteRule^tdmpoeme.php(.*) https://www.lespoetes.net/poeme.php?cat=tdm&id=%1 [L] 


          J'avoue que je suis à la ramasse, mais j'ai déjà un peu avancé...


          Merci pour votre retour

          -
          Edité par Rickways 28 septembre 2018 à 9:40:11

          • Partager sur Facebook
          • Partager sur Twitter
            28 septembre 2018 à 11:37:25

            • Il manque un espace entre RewriteCond comme RewriteRule et le motif
            • le point s'échappe s'il est littéral
            • (.*) est inutile, on attend rien après tdmpoeme.php, du coup il faudrait même un ancrage ($)
            • si la redirection est permanente, il faut l'indiquer par le flag R=permanent (c'est 302/temporaire par défaut)
            • si on tape sur le même domaine, il n'est pas utile d'utiliser une URL complète (virer https://www.lespoetes.net), ce qui permet en plus de faire des tests sur un autre environnement
            • id=(.*) est incorrect, tu vas reprendre tous les paramètres qui suivent éventuellement l'id plus éventuellement capturer un paramètre dont le nom termine par id. (?:^|&)id=(\d+) serait plus strict

            Après si tu testes tu dois bien savoir si tu obtiens ce que tu souhaites ou non (mais attention, quand on joue avec des redirections permanentes, de bien vider son cache entre ses tests)

            PS : zut, j'ai zappé que ça va faire un an et demi que le forum est buggué : il faut lire & à ce &

            -
            Edité par julp 28 septembre 2018 à 11:39:51

            • Partager sur Facebook
            • Partager sur Twitter
              28 septembre 2018 à 21:46:57

              Merci pour le coup de main Mr JULP

              j'ai réussi avec toutes tes indications à faire fonctionner cette redirection, 

              voici pour ceux qui liraient le topic, la solution finale : 

              RewriteCond %{QUERY_STRING} (?:^|&)id=(\d+)
              RewriteRule ^tdmpoeme.php$ /poeme.php?cat=tdm&id=%1 [R,L] 

              Serait-ce trop te demander d'expliciter l'écriture de la récupération de variable dans le RewriteCond ?

              En première lecture, la première partie semble expliquer que ça se passe après le point d'interrogation, le id= au milieu est le nom de la variable et le (\d+) permettrait de récupérer "n'importe quel chiffre" situé après...

              Ta remarque sur la redirection temporaire m'intéresse, cette redirection est destinée à indiqué à google que la page à changer de place, serait-il intéressant de mettre justement l'indication comme quoi cette redirection est temporaire ?

              Merci d'avance pour ton retour (ou le regard d'autres experts du regex)

              • Partager sur Facebook
              • Partager sur Twitter
                28 septembre 2018 à 22:43:38

                Je ne vais pas réexpliquer ici tous les détails de la réécriture quand on les trouve dans tes tutos ou la doc mais tu sembles avoir compris l'idée.

                > Ta remarque sur la redirection temporaire m'intéresse, cette redirection est destinée à indiqué à google que la page à changer de place, serait-il intéressant de mettre justement l'indication comme quoi cette redirection est temporaire ?

                Elle devrait donc être permanente (remplacer R par R=permanent)

                Il manque toujours l'échappement du point : ^tdmpoeme.php$ => ^tdmpoeme\.php$ sinon tu serais susceptible d'accepter n'importe quel octet à cet endroit (tdmpoeme3php, tdmpoemexphp, etc)

                -
                Edité par julp 28 septembre 2018 à 23:32:32

                • Partager sur Facebook
                • Partager sur Twitter

                Url rewriting htaccess

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown