Rainer: Weiterleitung per htaccess, URL mit Parametern

Hallo,
hab nun schon ein Weilchen das Forum durchsucht und "gegoogelt", aber je mehr ich finde desto verwirrender wird es für mich.

Ausgangssituation:
neue Domain für ein Projekt gebucht, bekommen, und geroutet. Super. Ging vielleicht 10 min. dann war sie nicht mehr erreichbar. Ist eine .help und es gab Probleme mit dem Service. Allerdings eben auch gleich an die Kunden gemailt. Mist - Telefon stand nicht mehr still. Also schnell eine andere Doamin draufgelegt und die Kunden benachrichtigt - UFF, gerade noch mal davon gekommen.

Jetzt war aber Google schon da - wieder Mist.
Habe jetzt eine Weiterleitung mit header 301 und header location:neue URL gebaut. Funktioniert, nur das die Parameter logischerweise nicht mit übergeben werden.
http://example.com/h=55 soll zu http://example.org/h=55 weitergeleitet werden.

Kann man da mit einer .htaccess was bauen? Mit header Location geht es ja wohl nicht. Da kommen angehängte pParameter nicht mit.

Gruß Rainer

  1. Habe jetzt eine Weiterleitung mit header 301 und header location:neue URL gebaut. Funktioniert, nur das die Parameter logischerweise nicht mit übergeben werden.
    http://example.com/h=55 soll zu http://example.org/h=55 weitergeleitet werden.

    Erstmal: In deinen URLs sind keine Parameter drin, Parameter stecken hinter einem Fragezeichen. Ich gehe mal davon aus, dass du diese vergessen hast.

    Kann man da mit einer .htaccess was bauen? Mit header Location geht es ja wohl nicht. Da kommen angehängte pParameter nicht mit.

    Was ist "header location"? PHP? Im HTTP-Kopf Location lassen sich selbstverständlich Parameter in einer URL ausgeben. Möglicherweise liegt dein Problem eher darin, eingehende Parameter zu lesen, weil PHP die abschneidet und in $_GET zur Verfügung stellt. In irgendeiner Variablen stellt PHP aber auch die komplette URL zur Verfügung – phpinfo(INFO_VARIABLES) gibt Auskunft.

    Falls du stattdessen im Apache umleiten willst, musst du auf mod_rewrite zurückgreifen, dort unter Zuhilfenahme von RewriteCond mit der Variablen QUERY_STRING.

    1. Habe jetzt eine Weiterleitung mit header 301 und header location:neue URL gebaut. Funktioniert, nur das die Parameter logischerweise nicht mit übergeben werden.
      http://example.com/h=55 soll zu http://example.org/h=55 weitergeleitet werden.

      Erstmal: In deinen URLs sind keine Parameter drin, Parameter stecken hinter einem Fragezeichen. Ich gehe mal davon aus, dass du diese vergessen hast.

      Kann man da mit einer .htaccess was bauen? Mit header Location geht es ja wohl nicht. Da kommen angehängte pParameter nicht mit.

      Was ist "header location"?

      Zweites Code-Snippet
      Er meinte wohl den Header-"Eintrag" "Location" den du mit

      Im HTTP-Kopf Location […]

      selbst ansprichst.

      Falls du stattdessen im Apache umleiten willst, musst du auf mod_rewrite zurückgreifen, dort unter Zuhilfenahme von RewriteCond mit der Variablen QUERY_STRING.

      Ich schieß grad voll ins Blaue, aber die Redirect-Direktive klingt eher nach einem Redirect, als mod_rewrite dafür zu benutzen.

      Allerdings wird da aber auch nicht auf den Querystring eingeganen. Also kann ich auch falsch liegen.

      MfG
      bubble

      --
      If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
      1. Falls du stattdessen im Apache umleiten willst, musst du auf mod_rewrite zurückgreifen, dort unter Zuhilfenahme von RewriteCond mit der Variablen QUERY_STRING.

        Ich schieß grad voll ins Blaue, aber die Redirect-Direktive klingt eher nach einem Redirect, als mod_rewrite dafür zu benutzen.

        Allerdings wird da aber auch nicht auf den Querystring eingeganen.

        Genau deshalb muss für Weiterleitungen mit Parametern mod_rewrite eingesetzt werden – Redirect vergleicht keine Parameter.

  2. http://example.com/h=55 soll zu http://example.org/h=55 weitergeleitet werden.

    Klar. geht

    RewriteEngine on

    Wenn Server-Name nicht "example.com" ist:

    RewriteCond %{SERVER_NAME} !^example.com$ [NC]

    schicke weiter zu example.org und hänge allen Stuff an:

    RewriteRule ^(.*)$ http://example.org/$1 [R,L]

    Das geht sogar dann, wenn die virtuellen Hosts das gleiche Verzeichnis haben.

    Jörg Reinholz

    1. Tach!

      schicke weiter zu example.org und hänge allen Stuff an:

      RewriteRule ^(.*)$ http://example.org/$1 [R,L]

      Allen, bis auf den Querystring. Das Flag QSA fehlt.

      dedlfix.

      1. Tach!

        schicke weiter zu example.org und hänge allen Stuff an:

        RewriteRule ^(.*)$ http://example.org/$1 [R,L]

        Allen, bis auf den Querystring. Das Flag QSA fehlt.

        Äh. Also mein Apache macht es mit Querystring (wird von http:// zu https:// weiter geleitet). Und das ist auch zu erwarten, weil hier die Klammer in der RewriteRule alles vom Anfang bis zum Ende der GET-Anforderung umfasst. Da gehört der Querystring dazu...

        Jörg Reinholz

        1. Tach!

          schicke weiter zu example.org und hänge allen Stuff an:

          RewriteRule ^(.*)$ http://example.org/$1 [R,L]
          Allen, bis auf den Querystring. Das Flag QSA fehlt.
          Äh. Also mein Apache macht es mit Querystring (wird von http:// zu https:// weiter geleitet). Und das ist auch zu erwarten, weil hier die Klammer in der RewriteRule alles vom Anfang bis zum Ende der GET-Anforderung umfasst. Da gehört der Querystring dazu...

          Jein, der Querystring wird in dem Fall entgegen meiner Annahme angehängt, die Erklärung dazu ist aber eine andere. Im Handbuch bei RewriteRule im Kasten "What is matched?" steht, dass der Querystring nicht ausgewertet wird. Er befindet sich also nicht mit in $1. Etwas weiter unten im Kasten "Modifying the Query String" steht, dass er angehängt wird, solange man nicht selbst einen erstellt. Das Flag QSA braucht man also, wenn man bei der Angabe des Ziels ein ? verwendet. Man sieht ja öfter solche Umschreibungen

          RewriteRule ^(.*)$ index.php?param=$1

          und bei denen ist der ursprüngliche Querystring weg. Erst mit QSA wird er angefügt.

          In deiner Regel ist mindestens ^ und $ überflüssig. Ein .* ist gierig und frisst sowieso alles. Man kann dann auch noch die Klammern weglassen und $0 verwenden. Damit hat man auch den gesamten Ausdruck, der ja wegen des gierigen .* den gesamten Pfad enthält.

          dedlfix.

  3. Danke Jörg und dedlfix,

    mit dem Flag QSA funktioniert es soweit.
    Aber bekommt Google dann auch den header 301 moved permanently mitgeteilt?

    Rainer

    1. Ok, gerade gefunden.

      Das Flag R als R=301 einsetzen. Das sollte passen.

      Danke
      Rainer

    2. Danke Jörg und dedlfix,

      mit dem Flag QSA funktioniert es soweit.

      Bei mir auch ohne...

      Aber bekommt Google dann auch den header 301 moved permanently mitgeteilt?

      In meinem Beispiel gibt es den Header 302 (Found).

      Man kann das also mit wget ganz einfach überprüfen.

        
      ~> wget -d -O /dev/null http://... alte Adresse  
      
      

      Antwort:

        
      ---request begin---  
      GET / HTTP/1.1  
      User-Agent: Mozilla/5.0 (Windows rv:32.0) Gecko/20100101 Firefox/32.0  
      Accept: */*  
      Host: x60.home  
      Connection: Keep-Alive  
        
      ---request end---  
      HTTP-Anforderung gesendet, warte auf Antwort...  
      ---response begin---  
      HTTP/1.1 302 Found  
      Date: Wed, 03 Dec 2014 22:05:33 GMT  
      Server: Apache  
      Location: https://x60.home/  
      Content-Length: 201  
      Keep-Alive: timeout=5, max=100  
      Connection: Keep-Alive  
      Content-Type: text/html; charset=iso-8859-1  
      ---response end---  
      
      

      Wie Du den Response-Code setzt hast Du ja schon geschrieben.

      Jörg Reinholz