Zur Navigation

Weiterleiten einer URL abhängig vom Query String [5]

..bei Anwesenheit von mehreren Query Strings

41 Jörg Kruse

Was heißt denn für dich "umwandeln" - weiterleiten auf die neue URL?

Du kannst einen geklammerten Ausdruck in einer RewriteCond mit einem %1 in der Ziel-URL der RewriteRule wiederaufnehmen

RewriteEngine on
RewriteCond %{QUERY_STRING} ID=([0-9]+)
RewriteRule ^datei_artikel.php$ http://www.domainxyz.com/datei_artikel_neu.php?ID=%1 [R=301]

09.06.2011 08:22

42 Martin (Gast)

Hallo Jörg,
super! Vielen Dank. Hat funktioniert. Allerdings musste ich noch [R=301,L] anhängen. Ich weiß nicht warum, aber das mit dem L war bei uns schon einmal so der Fall. Ergibt das aus deiner Sicht einen Sinn?

Nochmals vielen Dank!

09.06.2011 22:52

43 Jörg Kruse

Ja, das macht Sinn, wenn weitere Rules folgen, die nicht mehr auf die weiterzuleitende URL angewandt werden sollen.

09.06.2011 23:21

... 2 Monate später ...

44 kasseljulian

Hallo,

auch wenn der Post schon einige Monate zurück liegt, würde ich gerne meine Frage stellen.
Ich verstehe nicht all zu viel von .htacces, doch möchte ich eine Datei die von der Strukturierung wie folgt aussieht:
www.domain.de/index.php?name=sitename
nach
www.domain.de/index.php?name=sitenameNEW
umleiten.
Dafür hatte ich diesen Code:
Redirect 301 /users/w/asd.html http://www.harmonie-art.de/users/w/neueDatei.html
doch leider funktioniert dieser nur bei HTML-Dateien.
Gibt es da eine Lösung für meine Version?

Über Hilfe wäre ich sehr dankbar.
Liebe Grüße

27.08.2011 17:49

45 Jörg Kruse

Ich würde hier wie in den andern Beispielen in diesem Thread auch mit mod_rewrite weiterleiten, um den Query String berücksichtigen zu können

RewriteEngine on
RewriteCond %{QUERY_STRING} name=sitename
RewriteRule ^index\.php$ http://example.com/index.php?name=sitenameNEW [R=301,L]

27.08.2011 20:53 | geändert: 27.08.2011 20:53

46 kasseljulian

Zitat von Jörg
Ich würde hier wie in den andern Beispielen in diesem Thread auch mit mod_rewrite weiterleiten, um den Query String berücksichtigen zu können

RewriteEngine on
RewriteCond %{QUERY_STRING} name=sitename
RewriteRule ^index\.php$ http://example.com/index.php?name=sitenameNEW [R=301,L]
Vielen herzlichen Dank. Das war die Lösung nach der ich mehrere Stunden gesucht hatte. Wenn die Weiterleitung mehrere Domains betreffen würde (sprich mehrere Weiterleitungen), müsste ich dennoch vor jeder Weiterleitung RewriteEngine on schreiben?
Vielen herzlichen Dank und
liebe Grüße

27.08.2011 22:00 | geändert: 27.08.2011 22:02

47 Jörg Kruse

"RewriteEngine on" benötigst du nur einmal in der htaccess Datei

27.08.2011 22:07

... 1 Monat später ...

48 Sarah (Gast)

Hallo Jörg,

meine 301 Weiterleitung von einigen Unterseiten gelingt mir "dank" der bestehendes RewriteRules für die Erstellung suchmaschinen- und userfreundlicherer URLs leider nicht.
Versuchte es auch anfangs mit Redirect 301, aber wie ich hier im Forum las, sollte ich aufgrund der Questry String Modrewrite mit dem [L] Flag verwenden. Jegliche Bemühungen diese auf die neue URL weiterzuleiten schlugen jedoch fehl.

Hier ein Beispiel der RewriteRule für die Kategorien:
RewriteRule ^(.*)-c-(.*)-(.*).html$ index.php?cPath=$2&shop_ID=$3&%{QUERY_STRING}

Somit wird die URL der "alten Kategorie" (auch nach Löschung):
www.meinedomain.de/altedatei-c-61-1.html
automatisch zu:
www.meinedomain.de/?cPath=61&shop_ID=1

hier erscheint dann eine leere Seite auf der Startseite

Nach Wegfall einiger (doppelter) Produkte führen diese URL nun auf die Startseite:
www.meinedomain.de/index.php?sessID=xyz
mit glücklicherweise auch dem Inhalt der Startseite :)

Wie ich hier im Forum las sollte ich aufgrund des Query String Modrewrite mit dem [L] Flag verwenden. J

Meine letzten Versuche für die Umleitung der oben erwähnten Kategorie:
RewriteRule ^datei-c-61-1\.html$ http://www\.meinedomain\.de/neuedatei-c-109_110-1\.html/? [R=301,L]
Hiernach ändert sich nichts an der automatischen Weiterleitung zu "?c*"
Habe zudem gesehen, das es Beiträge gibt, in denen Du empfielst, die Punkte zu maskieren und in anderen hast Du sie weggelassen. Welcher Grund besteht hierfür und ist es auch in meinem Fall bedeutsam?

oder

RewriteCond %{QUERY_STRING} cPath=61&shop_ID=1
RewriteRule ^meinedomain\.de$ http://www.meinedomain.de/neuedatei-c-109_110-1\.html/? [R=301,L]
Hiernach erscheint auch die neue URl (ohne ?c*) aber dafür komme ich nur auf die Startseite (bildliche Anzeige wie vor Einwahl zum Admin mit Verlinkungen auf den Shop, ohne Möglichkeit den Shop zu betreten)
Dies führt vermutlich dazu, das alle Unterseite auf diese URl "neuedatei*" umgeleitet würden. Ist es denn ein Ansatz oder ist die URL der "automatischen Weiterleitung" hierbei zu vernachlässigen?

Lieben Dank im Voraus,
Sarah

23.10.2011 15:29

49 Jörg Kruse

Habe zudem gesehen, das es Beiträge gibt, in denen Du empfielst, die Punkte zu maskieren und in anderen hast Du sie weggelassen. Welcher Grund besteht hierfür und ist es auch in meinem Fall bedeutsam?

Der Punkt ist ein Meta-Zeichen in regulären Ausdrücken mit der Bedeutung "irgendein Zeichen." Wenn man den Punkt als solchen im Muster verwenden möchte, muss man ihn mit einem Backslash versehen.

Der reguläre Ausdruck, das heißt das gesuchte Muster, ist das, was direkt hinter "RewriteRule" steht. Bei dem Weiterleitungsziel am Ende handelt es sich dagegen nicht um einen regulären Ausdruck, also müssen dort auch keine Punkte und sonstige Meta-Zeichen maskiert werden. Die von mir markierten Backslashes z.B. in dieser Codezeile sind also fehl am Platze:

RewriteRule ^datei-c-61-1\.html$ http://www\.meinedomain\.de/neuedatei-c-109_110-1\.html/? [R=301,L]

Das Muster der RewriteRule beinhaltet Pfad und Dateinamen. In diesem Fall leitest du die URL "http://www.meinedomain.de/meinedomain.de?cPath=61&shop_ID=1" weiter:

RewriteCond %{QUERY_STRING} cPath=61&shop_ID=1
 RewriteRule ^meinedomain\.de$ http://www.meinedomain.de/neuedatei-c-109_110-1\.html/? [R=301,L]

Ich nehme aber mal an, dass du http://www.meinedomain.de/?cPath=61&shop_ID=1 weiterleiten möchtest? das Muster wäre dann ein bloßes "^$"

Die Weiterleitungen sollten zudem vor den anderen Rules platziert sein, damit letztere nicht dazwischenfunken können. Ansonsten hilft auch das [L] nicht weiter.

Mir ist auch noch nicht so ganz klar, wo du eine URL wirklich weiterleiten möchtest, d.h. dass sich die URL in der Adresszeile des Browser entsprechend ändern soll, und wo beim Aufruf einer URL der Inhalt einer anderen URL angezeigt werden soll, ohne die URL weiterzuleiten. Falls du mit meinen Tipps nicht weiterkommst, wäre es hilfreich, wenn du dies nochmal klarstellen kannst und den kompletten Inhalt der htaccess Datei postest.

23.10.2011 18:32 | geändert: 23.10.2011 18:51

50 Sarah (Gast)

Hallo Jörg,

lieben Dank für die schnelle Antwort und die Erklärungen zu der Thematik, wann ein Backslash vor einem Punkt notwenig ist. :D

Es ist mir nur daran gelegen, die URL weiterzuleiten und das diese neue URL dann auch in der Adresszeile angezeigt wird.

Die 2. Möglichkeit "*?c*" weiterzuleiten statt die Originalseite habe ich nur aufgeführt, da die "normale" Weiterleitung weder mit Redirect noch mit RewriteRule oder RewriteCond funktionierte. Daher dachte ich es könnte vielleicht leichter sein die URL der automatischen Weiterleitung (URL mit Query String) nochmals weiterzuleiten, da sich dabei zumindest der Query String abhängen ließ und der Shop keinen fatalen "Internal Error" bekam und somit nicht mehr aufrufbar war.

Hatte schon mehrfach versucht, die Regeln als erste aufzuführen. Dies funktionierte bisher trotz des Zusatzes "L" nicht. Mit der neuen RewriteRule funktioniert es dann jetzt heute plötzlich, nachdem ich einiges änderte, was vermutlich nur gewesen wichtig ist, wenn die Regel die den Query String erzeugt vor den "Neuen" steht, da sie sonst ja noch nicht zur Anwendung kommt.

Jedenfalls gelang es mir nun mit Deinen Empfehlungen und doch vor den anderen Regeln mit:
RewriteEngine On
RewriteBase /
Options +FollowSymLinks

RewriteRule ^yogakissen-c-61-1.html\.html http://www.meine-domain.de/yogakissen-c-109_110-1.html [R=301,L]

Ich bin ja so froh, das es nun klappt und dann auch noch so einfach war! :D

Ganz lieben Gruss,
Sarah

24.10.2011 23:09