Weiterleitung per htaccess, URL mit Parametern

- programmiertechnik
0 Mattes0 Jörg Reinholz0 dedlfix
0 Jörg Reinholz0 dedlfix
0 Rainer
0 Rainer
0 Jörg Reinholz
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
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.
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
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.
http://example.com/h=55 soll zu http://example.org/h=55 weitergeleitet werden.
Klar. geht
RewriteEngine on
RewriteCond %{SERVER_NAME} !^example.com$ [NC]
RewriteRule ^(.*)$ http://example.org/$1 [R,L]
Das geht sogar dann, wenn die virtuellen Hosts das gleiche Verzeichnis haben.
Jörg Reinholz
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.
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
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.
Danke Jörg und dedlfix,
mit dem Flag QSA funktioniert es soweit.
Aber bekommt Google dann auch den header 301 moved permanently mitgeteilt?
Rainer
Ok, gerade gefunden.
Das Flag R als R=301 einsetzen. Das sollte passen.
Danke
Rainer
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