Weiterleitung mit Get-Parameter
Phil
- webserver
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
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
»» ^.*.html?var1=wert1$
Dieser Regex findet z.B.
http://example.org/foo.htmlvar1=wert1oder
http://example.org/foo.htmvar1=wert1aber nicht (wie gewünscht, nehme ich an)
http://example.org/foo.html?var1=wert1Sonderzeichen, 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]
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
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]
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
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
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
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
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
Mahlzeit Hopsel,
Wenn du den Querystring mitschleifen möchtest, entferne das Fragezeichen.
Oder verwende das Flag QSA.
MfG,
EKKi