Phil: Weiterleitung mit Get-Parameter

Ich möchte eine Seite mit GET-Parameter weiterleiten, leider ohne Erfolg.

das funktioniert (ohne GET):

RewriteEngine  on
RewriteRule  ^.*.html$ http://www.beispiel.de [R]

das nicht:
RewriteRule  ^.*.html?var1=wert1$ http://www.beispiel.de [R]

was muss man ändern?

Phil

  1. Hi Phil!

    ^.*.html?var1=wert1$

    Dieser Regex findet z.B.
    http://example.org/foo.htmlvar1=wert1

    oder
    http://example.org/foo.htmvar1=wert1

    aber nicht (wie gewünscht, nehme ich an)
    http://example.org/foo.html?var1=wert1

    Sonderzeichen, also Zeichen, die eine besondere Bedeutung haben, müssen maskiert werden.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. »» ^.*.html?var1=wert1$
      Dieser Regex findet z.B.
      http://example.org/foo.htmlvar1=wert1

      oder
      http://example.org/foo.htmvar1=wert1

      aber nicht (wie gewünscht, nehme ich an)
      http://example.org/foo.html?var1=wert1

      Sonderzeichen, also Zeichen, die eine besondere Bedeutung haben, müssen maskiert werden.

      »»
      Hallo Hopsel,

      Mit \ maskiert geht's auch nicht:

      RewriteRule  ^.*.html?var1=wert1$ http://www.beispiel.de [R]

      1. Hi Phil!

        Mit \ maskiert geht's auch nicht:

        Mein Fehler. Der Querystring wird nicht an die RewriteRule übergeben.
        Richtig wäre:

        RewriteCond %{QUERY_STRING} var1=wert1  
        RewriteRule  ^.*\.html$ http://fp-server/test/? [R]
        

        Wenn du den Querystring mitschleifen möchtest, entferne das Fragezeichen.

        Nachzulesen in der Dokumentation zu mod_rewrite.
        Such dort mal nach "Note: Query String".

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. RewriteCond %{QUERY_STRING} var1=wert1

          RewriteRule  ^.*.html$ http://fp-server/test/? [R]

          
          >   
          > Wenn du den Querystring mitschleifen möchtest, entferne das Fragezeichen.  
          >   
          > Nachzulesen in der [Dokumentation zu mod_rewrite](http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html).  
          > Such dort mal nach "Note: Query String".  
            
          Danke, so geht es (beide Varianten). Der Link ist auch hilfreich.  
          Wofür steht das Fragezeichen?  
          Es sollen aus einem CMS einst dynamischen Seiten auf statische  
          Umgeleitet werden.  
          Muss man jetzt für jede Seite diese Regel angeben?  
            
          ~~~apache
          RewriteCond %{QUERY_STRING} var1=wert1  
          RewriteRule  ^.*\.html$ http://fp-server/test/Seite1.html? [R,301]
          

          .......

          RewriteCond %{QUERY_STRING} var1=wert50  
          RewriteRule  ^.*\.html$ http://fp-server/test/Seite50.html? [R,301]
          
          1. Hi Phil!

            Danke, so geht es (beide Varianten). Der Link ist auch hilfreich.
            Wofür steht das Fragezeichen?

            Ähem... Das hatte ich doch verlinkt.
            Zitat:
            You can, however, create URLs in the substitution string, containing a query string part. Simply use a question mark inside the substitution string, to indicate that the following text should be re-injected into the query string. When you want to erase an existing query string, end the substitution string with just a question mark. To combine a new query string with an old one, use the [QSA] flag.

            "substitution string" ist in deinem Fall die Seite, auf die weitergeleitet wird.

            Auf Deutsch: Wenn du den existierenden Querystring nicht weiterleiten möchtest, gibst du ein Fragezeichen an. Tust du das nicht, wird der alte Querystring einfach durchgeschleift und steht ggf. einem Skript zur Verfügung.
            Möchtest du einen zusätzlichen Parameter an den Querystring anhängen, kannst du das mit dem [QSA]-Flag tun.

            Muss man jetzt für jede Seite diese Regel angeben?

            Natürlich nicht!

            RewriteCond %{QUERY_STRING} var1=wert1

            RewriteRule  ^.*.html$ http://fp-server/test/Seite1.html? [R,301]

            
            > ~~~apache
            
            RewriteCond %{QUERY_STRING} var1=wert50  
            
            > RewriteRule  ^.*\.html$ http://fp-server/test/Seite50.html? [R,301]
            
            

            Mir fällt gerade auf, dass ich meinen Testservernamen mitgepostet habe. Ups! =)

            Auch in einer RewriteCond können Regex verwendet werden.
            Zitat:
            RewriteCond backreferences: These are backreferences of the form %N  (1 <= N <= 9), which provide access to the grouped parts (again, in parentheses) of the pattern, from the last matched RewriteCond in the current set of conditions.

            Mit % referenzierst du also Gruppierungen aus einer RewriteCond.

            Möglich wäre also folgendes:

            RewriteCond %{QUERY_STRING} ^var1=wert([0-9]+)$  
            RewriteRule  ^.*\.html$ http://example.org/Seite%1.html? [R,301]
            

            Damit leitest du alle Aufrufe von
            http://example.org/FOO.html?var1=wertBAR
            auf
            http://example.org/SeiteBAR.html
            um.

            MfG H☼psel

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
            1. Mit % referenzierst du also Gruppierungen aus einer RewriteCond.

              Möglich wäre also folgendes:

              RewriteCond %{QUERY_STRING} ^var1=wert([0-9]+)$

              RewriteRule  ^.*.html$ http://example.org/Seite%1.html? [R,301]

              
              >   
              > Damit leitest du alle Aufrufe von  
              > http://example.org/FOO.html?var1=wertBAR  
              > auf  
              > http://example.org/SeiteBAR.html  
              > um.  
                
              Danke für deine Mühe, ist ein kompliziertes Thema.  
                
              
              > ~~~apache
              
              RewriteCond %{QUERY_STRING} ^var1=wert([0-9]+)$  
              
              > RewriteRule  ^.*\.html$ http://example.org/Seite%1.html? [R,301]
              
              

              Hiermit sieht es so aus:
              http://example.org/index.html?var1=01 --> http://example.org/Seite01.html
              ....
              http://example.org/index.html?var1=55 --> http://example.org/Seite55.html

              -------------------------------------------

              Soll aber so sein (Beispiel):
              http://example.org/index.html?var1=01 --> http://example.org/INDEX.html
              ....
              http://example.org/index.html?var1=55 --> http://example.org/IMPRESSUM.html

              1. Hi Phil!

                Soll aber so sein (Beispiel):
                http://example.org/index.html?var1=01 --> http://example.org/INDEX.html
                ....
                http://example.org/index.html?var1=55 --> http://example.org/IMPRESSUM.html

                Und jetzt sieht man, dass wir uns die ganze Mühe umsonst gemacht haben.
                Mensch Phil, diese Informationen müssen viel eher kommen!
                An sowas geht man anders heran.

                Du leitest alle Anfragen auf ein Skript um:
                RewriteRule  ^.*\.html$ http://example.org/rewriteold.php [R,301]

                In dem Skript hast du dann ein Array, dass die Weiterleitungsseite enthält.

                $old_sites[1] = 'INDEX';  
                $old_sites[55] = 'IMPRESSUM';  
                // ...  
                  
                if(array_key_exists(intval($_GET['var1']),$old_sites))  
                {  
                  header('HTTP/1.1 301 Moved Permanently');  
                  header('Location: http://example.org/'.$old_sites[intval($_GET['var1'])].'.html');  
                }  
                else  
                {  
                // Fehlerseite  
                }
                

                Beachte, dass das Array auch mit Stringliteralen als Schlüssel arbeiten kann. Dann musst du aber auch dementsprechend auf Korrektheit der Schlüssel prüfen.

                MfG H☼psel

                --
                "It's amazing I won. I was running against peace, prosperity, and incumbency."
                George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
                1. Und jetzt sieht man, dass wir uns die ganze Mühe umsonst gemacht haben.
                  Mensch Phil, diese Informationen müssen viel eher kommen!
                  An sowas geht man anders heran.

                  Hallo Hospel,

                  danke für die viele Mühe. War nicht umsonst, die anderen Informationen
                  brauche dennoch, da auch die neuen Seiten auf ein PHP-Script umgeleitet
                  werden müssen (intern).

                  RewriteRule  ^([a-zA-Z0-9/-]*).html$ index.php?$1.html

                  Im PHP-Script werden dann die GET-Parameter ausgewertet und dann die
                  entsprechenden Module, Templates etc. geladen. Das ganze holt dann die
                  Inhalte aus der DB.

                  Vielen Dank noch mal für die Geduld, ich habe heute viel gelernt!
                  Ich werde mich noch mal eingehender mit Regular Expressions und dem
                  Mod_rewrite auseinander setzen.

                  Gruß

                  Phil

                  1. Hi Phil!

                    RewriteRule  ^([a-zA-Z0-9/-]*).html$ index.php?$1.html
                    Im PHP-Script werden dann die GET-Parameter ausgewertet [...]

                    Beachte aber, dass du mit dieser RewriteRule den Querystring komplett ersetzt.
                    Wenn du ihn erweitern möchtest, benötigst du das QSA-Flag:
                    RewriteRule  ^([a-zA-Z0-9/-]*).html$ index.php?name=$1 [QSA,L,R=301]

                    So stehen dir alle anderen Parameter noch zur Verfügung. Brauchst du sie nicht, dann ersetze den Querystrig ruhig, aber gib dem Parameter wenigstens einen Namen.

                    Vielen Dank noch mal für die Geduld, [...]

                    Kein Problem.

                    [...] ich habe heute viel gelernt!

                    Ich auch. =)

                    MfG H☼psel

                    --
                    "It's amazing I won. I was running against peace, prosperity, and incumbency."
                    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        2. Mahlzeit Hopsel,

          Wenn du den Querystring mitschleifen möchtest, entferne das Fragezeichen.

          Oder verwende das Flag QSA.

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|