Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rewrite Apache

et Regex @_@

Sujet résolu
    23 janvier 2012 à 2:29:13

    Bonjour à tous !

    Je veux faire une ré-écriture d'URL en utilisant les regex dans le .htaccess :

    Une URL de ce genre :
    index.php?2012/01/20/21/51/57-blabla

    Doit aller là :
    index.php?d=2012/01/20/21/51/57-blabla


    En gros, ajouter un « d= » entre le « ? » et le début du Query-string.
    Sachant que :
    - le « index.php » n'est pas toujours présent ;
    - le « ? » peut également être absent.

    Donc j'utilise ça :

    RedirectMatch ^(.*)/(index.php)?[?]?([0-9]{4}(/[0-9]{2}){5})(.*)?$ $1/index.php?d=$3$5
    


    Et biensûr, ça ne marche pas avec certaines URL, comme cella là :
    index.php?2012/01/20/21/51/57-blabla


    Le soucis, c'est que je n'arrive pas à cibler le « ? » dans la Regex…
    J'ai tenté « [?] », « \? », mais rien ne marche :(.

    Merci par avance !
    • Partager sur Facebook
    • Partager sur Twitter
      23 janvier 2012 à 5:06:02

      Premièrement la directive RewriteRule ne permet pas de traiter la "chaine de requête", mais seulement la partie de l'URL qui se situe entre celle-ci et le nom de domaine. Il faut donc associer une directive RewriteCond à cette règle pour traiter la partie manquante.
      Deuxièmement si le ? n'est pas présent, l'URL s'en trouvera grandement changée puisqu'il n'y aura plus de chaine de requête, mais seulement un chemin de plusieurs dossiers. Il faut donc créer deux règles distinctes pour chacun de ces cas.

      RewriteEngine On
      
      # %0 correspond à la chaine qui a rempli la condition (c'est à dire la chaine de requête)
      RewriteCond %{QUERY_STRING} ^\d{4}(/\d{2}){5}.*
      RewriteRule ^(index\.php)?$ index.php?d=%0
      
      RewriteRule ^\d{4}(/\d{2}){5}.* index.php?d=$0
      


      Fonctionne avec :
      • index.php?2012/01/20/21/51/57-blabla
      • ?2012/01/20/21/51/57-blabla
      • 2012/01/20/21/51/57-blabla

      • Partager sur Facebook
      • Partager sur Twitter
        23 janvier 2012 à 14:30:23

        Merci,

        Citation

        Deuxièmement si le ? n'est pas présent, l'URL s'en trouvera grandement changée puisqu'il n'y aura plus de chaine de requête, mais seulement un chemin de plusieurs dossiers. Il faut donc créer deux règles distinctes pour chacun de ces cas.


        C'est ça le problème : il faut que j'ai une redirection :
        - quand l'URL est fausse ;
        - quand la chaine de requêtes est fausse ;

        Ton code fonctionne \o/.

        Mais il n'est pas parfait : l'URL reste la même, c'est une ré-écriture. Ce que j'aimerais vraiment, c'est une redirection (donc que l'URL dans la barre d'adresse soit changée aussi), utilisant Apache (non PHP).
        Est-ce possible ?

        Peut-être en utilisant les deux directives à la suite : Rewrite + Redirect ?
        • Partager sur Facebook
        • Partager sur Twitter
          23 janvier 2012 à 15:49:34

          Il faut utiliser le drapeau R pour faire une redirection au lieu d'une réécriture.

          RewriteCond %{QUERY_STRING} ^\d{4}(/\d{2}){5}.*
          RewriteRule ^(index\.php)?$ /index.php?d=%0 [R,L]
          
          RewriteRule ^\d{4}(/\d{2}){5}.* /index.php?d=$0 [R,L]
          
          • Partager sur Facebook
          • Partager sur Twitter
            23 janvier 2012 à 17:23:38

            Yop, ça redirige.

            Mais ça redirige ainsi et je me retrouve avec ça :

            http://localhost/var/www/_TEST/cloud/i [...] /20/21/51/57-

            Il y'a le « /var/www » en trop. Je crois qu'il redirige sur le chemin absolu.

            Si j'utilise ça en plus ça marche :
            RedirectPermanent  /var/www/   /
            


            Mais je me demande si ça fait pas un peu trop et s'il n'y pas plus simple ?
            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2012 à 4:09:04

              Il faut fournir le chemin absolu du fichier depuis la racine du serveur Web dans la chaine de substitution.

              RewriteRule ^\d{4}(/\d{2}){5}.* /_TEST/cloud/index.php?d=$0 [R,L]
              
              • Partager sur Facebook
              • Partager sur Twitter
                24 janvier 2012 à 11:23:15

                Yop !

                Ça marche maintenant :-)

                Merci pour ton aide, Cortexd.
                • Partager sur Facebook
                • Partager sur Twitter

                Rewrite Apache

                × 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