Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme de rewriterule htaccess

Sujet résolu
    17 février 2022 à 10:37:07

    Bonjour à tous, 

    je viens vers vous car malgré plusieurs essais, je n'arrive pas à résoudre mon probleme

    je dois utiliser le rewirte pour 2 cas distincts: la regle qui fonctionne est la suivante :

      RewriteRule ^cadastre-([0-9]{5})-(.*)$ cadastre/$1/$2.html [L]
      RewriteRule ^cadastre-([0-9]{5})-(.*)\.html$ cadastre/$1/$2.html [L]

    je remplace simplement des - par des / et c'est ok

    mais dans mon sitemap, j'ai déjà les liens sous la forme cadastre/([0-9]{5})/(.*) et ces liens retournent directement à l'acceuil

    j'ai donc ajouté ceci car je veux juste ajouter .html à la fin

      RewriteRule ^cadastre/([0-9]{5})/(.*)$ /cadastre/$1/$2.html [L]
      RewriteRule ^cadastre/([0-9]{5})/(.*)\.html$ /cadastre/$1/$2.html [L]

    et la ca me fait direct une erreur 500

    j'ai testé aussi

    RewriteCond %{REQUEST_FILENAME} !-p
      RewriteRule . /$1.html [L]

    ca ne fonctionne pas

    voila oon htaccess complet

    <IfModule mod_rewrite.c>
    
      RewriteEngine On
      RewriteBase /
      RewriteRule ^index\.html$ - [L]
    
      # only for next generated static data json files
      RewriteRule ^(.*)\.json - [L]
    
      # rewrites rules for cadastre / plu files
      RewriteRule ^cadastre-([0-9]{5})-(.*)$ cadastre/$1/$2.html [L]
      RewriteRule ^cadastre-([0-9]{5})-(.*)\.html$ cadastre/$1/$2.html [L]
    
      #RewriteRule ^cadastre/([0-9]{5})/(.*)$ /cadastre/$1/$2.html [L]
      #RewriteRule ^cadastre/([0-9]{5})/(.*)\.html$ /cadastre/$1/$2.html [L]
      
      # when refresh on generic plu / cadastre page
      RewriteCond %{REQUEST_FILENAME} cadastre/$
      RewriteRule ^(.*)/$ $1.html [L]
    
      #RewriteCond %{REQUEST_FILENAME} !-p
      #RewriteRule . /$1.html [L]
    
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-l
      RewriteRule . /$1 [L]
    </IfModule>

    et je suis à cours de solutions avez vous des idées à me soumettre svp?

    merci beaucoup

    • Partager sur Facebook
    • Partager sur Twitter
    Souvent la moitié de la réponse se trouve dans une question bien posée.
      17 février 2022 à 11:24:19

      Qu'est-ce que "ça" et "ces liens"? Quelles sont les (exemples d')URL parce que les règles L14/15 doivent sans doute en boucler, d'où, probablement la 500 (bien que tu aurais pu en trouver la raison exacte dans ton log d'erreur d'Apache). Le tout étant de clairement identifier ce qu'il faut réécrire ou non, les règles L14/15 devant sûrement être trop large au point d'englober ce vers quoi elles sont renvoyées. Est-ce que cadastre/$1/$2.html existent physiquement d'ailleurs ? Si c'est le cas, un premier fix serait d'exclure ce qui existe physiquement (RewriteCond %{REQUEST_FILENAME} !-f).

      \.html est compris par le (.*)$ de la règle précédente donc elle ne sera jamais exécutée non plus (lignes 12/15).

      > j'ai donc ajouté ceci car je veux juste ajouter .html à la fin

      Je ne saisis pas en quoi la règle L15 le permet.

      RewriteRule ^cadastre/([0-9]{5})/(.*)\.html$ - [L]
      RewriteRule ^cadastre/([0-9]{5})/(.*)$ cadastre/$1/$2.html [L]
      

      Tout simplement ? (+ inverser les règles L11/L12)

      -
      Edité par julp 17 février 2022 à 13:24:31

      • Partager sur Facebook
      • Partager sur Twitter
        17 février 2022 à 12:05:42

        merci julp pour ta réponse rapide. j'ai toujours autant de mal avec le paramétrage serveur :(


        les url sont comme suit:
        /cadastre-codePostal-ville ou /cadastre-codePostal-ville.html

        mais il peut arriver qu on ait aussi :
        /cadastre/codePostal/ville ou /cadastre/codePostal/ville.html 

        les nom de ville peuvent avoir des tirets mais ni caractère spécial, ni espace, ni apostrophe
        en fait ces quatre url doivent etre reecrites pour acceder au fichier physique /cadastre/codePostal/ville.html


        je dois en effet inverser les lignes 11 et 12 sachant que la 12 est plus précise que la 11 et sera donc jamais lue
        les fichiers sont générés statiquement donc oui, ces fichiers existent tous physiquement
        il faudrait, si d'aventure un des fichier n'existait pas (certaines villes ont plusieurs code postaux et ca peut générer une erreur de chemin), etre redirigé vers l'accueil mais normalement c'est déjà le cas

        ps: dans le ca des url avec les tirets, ca fonctionne tres bien, mais pas pour les url avec les /

        -
        Edité par lamouche42 17 février 2022 à 12:17:16

        • Partager sur Facebook
        • Partager sur Twitter
        Souvent la moitié de la réponse se trouve dans une question bien posée.
          17 février 2022 à 13:25:24

          Et en ce qui concerne ce que je t'ai proposé ?

          > les fichiers sont générés statiquement donc oui, ces fichiers existent tous physiquement

          > Est-ce que cadastre/$1/$2.html existent physiquement d'ailleurs ? Si c'est le cas, un premier fix serait d'exclure ce qui existe physiquement (RewriteCond %{REQUEST_FILENAME} !-f)

          +

          RewriteRule ^cadastre/([0-9]{5})/(.*)\.html$ - [L]
          RewriteRule ^cadastre/([0-9]{5})/(.*)$ cadastre/$1/$2.html [L]
          
          • Partager sur Facebook
          • Partager sur Twitter
            17 février 2022 à 13:52:23

            merci beaucoup pour ton aide, je vais regarder ca demain à tete reposée, j'ai une autre tache en cours et je reviendrai te donner le resultat

            • Partager sur Facebook
            • Partager sur Twitter
            Souvent la moitié de la réponse se trouve dans une question bien posée.
              25 avril 2022 à 15:16:47

              je me suis remis sur ce problème, enfin ...

              Voila un résultat, fruit de ce que tu m'as conseillé et qui fonctionne à 95% :

              <IfModule mod_rewrite.c>
              
                RewriteEngine On
                RewriteBase /
                RewriteRule ^index\.html$ - [L]
              
                # only for next generated static data json files
                RewriteRule ^(.*)\.json - [L]
              
                # rewrites rules for cadastre / plu files
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-l
                RewriteRule ^cadastre/([0-9]{5})/(.*) cadastre/$1/$2.html [L]
                RewriteRule ^cadastre-([0-9]{5})-(.*)\.html$ cadastre/$1/$2.html [L]
                RewriteRule ^cadastre-([0-9]{5})-(.*)$ cadastre/$1/$2.html [L]
              
                # when refresh on generic cadastre page
                RewriteCond %{REQUEST_FILENAME} cadastre/$
                RewriteRule ^(.*)/$ $1.html [L]
              
                </IfModule>

              il couvre bien tous les cas de figure qu on peut rencontrer, seulement maintenant, si une url reecrite ne fonctionne pas, ca plante le serveur, alors qu avant ca retournait sur l'index.

              exemple :

              /cadastre-64100-bayonnee

              on a :

              Internal Server Error
              The server encountered an internal error or misconfiguration and was unable to complete your request.
              
              Please contact the server administrator at webmaster@localhost to inform them of the time this error occurred, and the actions you performed just before this error.
              
              More information about this error may be available in the server error log.

              alors qu' avec 

              <IfModule mod_rewrite.c>
              
                RewriteEngine On
                RewriteBase /
                RewriteRule ^index\.html$ - [L]
              
                # only for next generated static data json files
                RewriteRule ^(.*)\.json - [L]
              
                # rewrites rules for cadastre / plu files
                RewriteRule ^cadastre-([0-9]{5})-(.*)\.html$ cadastre/$1/$2.html [L]
                RewriteRule ^cadastre-([0-9]{5})-(.*)$ cadastre/$1/$2.html [L]
                
                # when refresh on generic plu / cadastre page
                RewriteCond %{REQUEST_FILENAME} cadastre/$
                RewriteRule ^(.*)/$ $1.html [L]
              
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-l
                RewriteRule . /$1 [L]
              </IfModule>

              je n'ai pas ce message pour la meme url.

              j'ai essayé de rajouter le dernier bloc pour tester si la nouvelle url existe, mais sans succes

              si quelqu un peut me dire ou est la coquille, merci :)




              • Partager sur Facebook
              • Partager sur Twitter
              Souvent la moitié de la réponse se trouve dans une question bien posée.
                25 avril 2022 à 16:39:50

                La ligne 13 génère une boucle infinie ?

                Qu'en dit le journal d'erreur d'Apache ?

                La négociation de contenu intervient et est en conflit avec la réécriture ?

                -
                Edité par julp 25 avril 2022 à 16:52:13

                • Partager sur Facebook
                • Partager sur Twitter
                  25 avril 2022 à 17:15:40

                  je pense que tu veux parler de ça ?

                  [Mon Apr 25 13:16:53.050932 2022] [core:error] [pid 681215:tid 140578675209984] [client 66.249.66.159:64363] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
                  

                  je comprend la reecriture infinie, il ajoute .html à chaque fois, mais ca veut dire que pour chaque reecriture, il recommence au debut du .htaccess? (ca semble le cas si il boucle)

                  par cette regle, je veux juste rajouter .html si jamais l'utilisateur saisie l'url à la main sans le mettre

                  comment faire dans ce cas precis?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Souvent la moitié de la réponse se trouve dans une question bien posée.
                    25 avril 2022 à 17:33:22

                    Ah, oui, tu as raison, ça devrait boucler en rajoutant ".html" à chaque itération pour ce qui n'existe pas :/

                    M'est d'avis qu'il faudrait d'abord traiter/ignorer la présence des URL avec .html, comme c'est réalisé pour l'autre, puis celles sans.

                      RewriteCond %{REQUEST_FILENAME} !-f
                      RewriteCond %{REQUEST_FILENAME} !-l
                      RewriteRule ^cadastre/([0-9]{5})/(.*) cadastre/$1/$2.html [L]
                    

                    Deviendrait :

                    RewriteRule ^cadastre/\d{5}/.+\.html$ - [L]
                    RewriteRule ^cadastre/(\d{5})/(.+) cadastre/$1/$2.html [L]
                    #RewriteRule ^cadastre/\d{5}/[^.]+$ cadastre/$0.html [L]
                    

                    Tu devrais ajouter Options -Multiviews au .htaccess et supprimer les IfModule (si le module de réécriture n'est vraiment pas disponible, tu l'as dans le baba de toute façon)

                    Quant à :

                      RewriteRule ^cadastre-([0-9]{5})-(.*)\.html$ cadastre/$1/$2.html [L]
                      RewriteRule ^cadastre-([0-9]{5})-(.*)$ cadastre/$1/$2.html [L]
                    

                    Ce serait, à mon avis, une bonne idée de faire une redirection surtout que ça risque d'être pris pour du duplicate content (plusieurs URL pour un même contenu).

                    RewriteRule ^cadastre-(\d{5})-(.+)(?:\.html)?$ cadastre/$1/$2.html [L,R=permanent]
                    #RewriteRule ^cadastre-(\d{5})-([^.]+)(?:\.html)?$ cadastre/$1/$2.html [L,R=permanent]
                    

                    -
                    Edité par julp 25 avril 2022 à 17:38:27

                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 mai 2022 à 10:59:58

                      bonjour :) 

                      me revoilà sur ce problème et je vais le fix aujourd'hui :p

                      j'ai quand même besoin d'une précision sur ce cas de figure :

                      RewriteRule ^cadastre/\d{5}/.+\.html$ - [L]
                      RewriteRule ^cadastre/(\d{5})/(.+) cadastre/$1/$2.html [L]

                      sur la 1ere ligne la règle est testée et si il y a .html à la fin, on ne fait rien. le tag L suspend la poursuite du fichier, mais dans ta tres complete doc, tu dis que les rules avec le tag L sons soumises à réécriture (différent de END) ca stop la lecture courante et ca soumet de nouveau l'url au .htaccess? 

                      Du coup, ne va t on pas être bloqué indéfiniment sur cette ligne? ou alors "ne rein faire" agit de façon particulière?
                      En gros, comment vas elle lire la règle suivante si la règle du dessus est vrai?

                      Je viens de tester donc ça fonctionne merci, mais si tu pouvais m'aiguiller sur cette subtilité, ce serait cool

                      fichier final :

                      <IfModule mod_rewrite.c>
                      
                        RewriteEngine On
                        RewriteBase /
                        RewriteRule ^index\.html$ - [L]
                      
                      
                        # if url is with / and .html or not
                        RewriteRule ^cadastre/\d{5}/.+\.html$ - [L]
                        RewriteRule ^cadastre/(\d{5})/(.+) cadastre/$1/$2.html [L]
                      
                        # if url is with - and .html or not
                        RewriteRule ^cadastre-(.*)-(.*)\.html$ cadastre/$1/$2.html [L]
                        RewriteRule ^cadastre-(.*)-(.*)$ cadastre/$1/$2.html [L]
                      
                        # only for next generated static data json files
                        # RewriteRule ^(.*)\.json - [L]
                      
                        # rewrites rules for commune files
                        RewriteRule ^ma-commune$ commune.html [L]
                      
                        # when refresh on generic cadastre page
                        RewriteCond %{REQUEST_FILENAME} cadastre/$
                        RewriteRule ^(.*)/$ $1.html [L]
                      
                      
                        RewriteCond %{REQUEST_FILENAME} !-f
                        RewriteCond %{REQUEST_FILENAME} !-l
                        RewriteRule . /$1 [L]
                      </IfModule>

                      je pense d'ailleurs que je peux virer les dernières lignes qui servent à rien

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Souvent la moitié de la réponse se trouve dans une question bien posée.
                        18 mai 2022 à 14:03:29

                        > tu dis que les rules avec le tag L sont soumises à réécriture (différent de END) ça stoppe la lecture courante et ça soumet de nouveau l'url au .htaccess ?

                        Admettons que le chemin est cadastre-00000/truc.html (= finit par .html), à l'issue d'un premier processus de réécriture, il trouve donc la règle RewriteRule ^cadastre/\d{5}/.+\.html$ - [L] qui correspond et lui indique de ne rien faire (-). Du fait du flag L(ast), la suite (les autres règles/RewriteRule) ne sont pas considérées. Comme il a été indiqué à Apache de ne rien faire (pas de nouvelle URL à appliquer, toujours via le -), il n'y aura donc pas de deuxième processus de réécriture et ça ne créera pas de boucle infinie.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 mai 2022 à 15:11:30

                          impec, merci bcp

                          je marque ce post comme résolu :p

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Souvent la moitié de la réponse se trouve dans une question bien posée.

                          probleme de rewriterule 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