Zur Navigation

URL umschreiben und Query-String variante umleiten

1 Helgon

Hi, ich habe da ein Problem.

Meine Seite ist so aufgebaut, dass praktisch alles in der index.php abläuft, aber immer mit unterschiedlichen Parametern.

Also hab ich erstmal alles umgeschrieben. Das läuft auch alles einwandfrei, aber weil wenn man Seo machen will, dann ja richtig ist mir aufgefallen das es ja zu Duplicate Content kommen würde weil die Seite über index.php?site=blabla&info=1 und auch über domain.de/blabla/1 aufgerufen werden kann.

Ich hab was probiert (siehe unten), aber das endet in einer wie ich vermute endlosschleife (browser sagt mir, dass es zu viele Umleitungen gab). Die ganzen htaccess ist etwas chaotisch, ich weis nicht ob alles andere überhaupt so ganz richtig ist, zumindest funtioniert es aber :)

Kommen wir zum konkreten Fall (wenn das klappt, sollte ichs auch analog für den Rest der Seite hinbekommen :))

Es soll so verfügbar sein.


adresse.de/index.php?site=project&project_id=1
adresse.de/project/1

das geht auch (allein) problemlos

RewriteRule ^project/([0-9]+)$ index.php?site=project&project_id=$1

dann aber wollt ich eben, dass wirklich nur noch adresse.de/project/1 allein verfügbar ist (wegen duplicate content), also muss ja auf die index.php?site=project&project_id= variante eine 301 weiterleitung, oder?

das hab ich erstmal testweise so probiert

RewriteCond %{QUERY_STRING} ^site=project&project_id=1$
RewriteRule ^index\.php$ http://www.q-visions.de/project/1? [L,R=301]

aber wenn ich das mache, kommt es eben zu den zu vielen umleitungen (wie der browser sagt).

Da hier ja die Reihenfolge insgesamt ne große Rolle spielt (wie mir scheint) post ich mal meine ganze htaccess.

Würde mich echt freuen wenn du mir helfen kannst Jörg :)

RewriteEngine on

RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.q-visions\.de$ [NC]
RewriteRule ^(.*)$ http://www.q-visions.de/$1 [R=301,L]

RewriteRule ^project/([0-9]+)$ index.php?site=project&project_id=$1



RewriteRule ^$ /home [R=301,L]

RewriteRule ^tutorial/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9-]+)$ index.php?site=tutorial&category=$1&topic=$2&title=$3
RewriteRule ^tutorial/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ index.php?site=tutorial&category=$1&topic=$2

RewriteRule ^project/([0-9]+)$ index.php?site=project&project_id=$1 [L]


RewriteCond %{QUERY_STRING} ^site=project&project_id=1$
RewriteRule ^index\.php$ http://www.q-visions.de/project/1? [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?site=$1 [L]

Grüße!

05.07.2012 13:33 | geändert: 05.07.2012 13:39

2 Jörg

Du kannst mit einer weiteren RewriteCond überprüfen, ob der URI in THE_REQUEST enthalten, und somit nicht Ergebnis eines Rewrites ist:

RewriteCond %{THE_REQUEST} /index\.php?site=project&project_id=
RewriteCond %{QUERY_STRING} ^site=project&project_id=1$
RewriteRule ^index\.php$ http://www.q-visions.de/project/1? [L,R=301]

05.07.2012 13:55

3 Helgon

Hallo, danke für die schnelle Antwort.

Ich hab nun folgendes stehen

RewriteCond %{THE_REQUEST} /index\.php?site=project&project_id=1
RewriteCond %{QUERY_STRING} ^site=project&project_id=1$
RewriteRule ^index\.php$ http://www.q-visions.de/project/1? [L,R=301]

RewriteRule ^project/([0-9]+)$ index.php?site=project&project_id=$1 // egal ob davor oder dahinter, kein Unterschied

und leider keine Veränderung

Die Seite ist weiterhin über beide Varianten erreichbar. Ich hätt aber gerne, dass index.php?site=project&project_id=1 auf project/1 umleitet

Grüße

( P.S:: kannst es ja testen www.q-visions.de)

05.07.2012 14:24

4 Jörg

Das Fragezeichen sollte wohl noch maskiert werden, probier's mal so:

RewriteCond %{THE_REQUEST} /index\.php\?site=project&project_id=1

05.07.2012 15:20

5 Helgon

Du bist mein ganz persönlicher Held, danke! :)

Eine Frage hätte ich dann grad noch.

Wie kann ich das ganze dynamisch gestalten? Also das es für jede id gillt (und nicht nur 1 in diesem Fall) - Habs mit paar Varianten probiert, aber bei den 3hier weis ich nicht mehr genau welches %1,2 $1 etc wo und wie hingehört

RewriteCond %{THE_REQUEST} /index\.php\?site=project&project_id=1
RewriteCond %{QUERY_STRING} ^site=project&project_id=1$
RewriteRule ^index\.php$ http://www.q-visions.de/project/1? [L,R=301]

Nochmal vielen Dank!
Grüße Helgon

05.07.2012 15:34

6 Jörg

%1, %2 etc. nehmen Ausdrücke aus RewriteConds auf, $1, $2 etc. Ausdrücke aus der RewriteRule. So sollte es gehen:

RewriteCond %{THE_REQUEST} /index\.php\?site=project&project_id=
RewriteCond %{QUERY_STRING} ^site=project&project_id=([0-9]+)$
RewriteRule ^index\.php$ http://www.q-visions.de/project/%1? [L,R=301]

05.07.2012 16:08

7 Helgon

Vielen herzlichen Dank! Ich kanns kaum in Worte fassen - so ne schnelle und kompetente Hilfe nach Stunden langem suchen und probieren!

Ich hab dann gleich noch zwei Fragen :)

Erstens: Macht das so Sinn wie ichs grad mache, oder gibts da eine elegantere Art und Weise?


### Tutorial
RewriteCond %{THE_REQUEST} /index\.php\?site=tutorial
RewriteCond %{QUERY_STRING} ^site=tutorial$
RewriteRule ^index\.php$ http://www.q-visions.de/tutorial? [L,R=301]

### Tutorial -> Category
RewriteCond %{THE_REQUEST} /index\.php\?site=tutorial&category=
RewriteCond %{QUERY_STRING} ^site=tutorial&category=([a-zA-Z0-9]+)$
RewriteRule ^index\.php$ http://www.q-visions.de/tutorial/%1/all? [L,R=301]

und die zweite Frage:

Wie klappt das mit mehreren Parametern? Mein Ansatz war

### Tutorial -> Category -> Topic

RewriteCond %{THE_REQUEST} /index\.php\?site=tutorial&category=&topic= // hier die zwei 
RewriteCond %{QUERY_STRING} ^site=tutorial&category=([a-zA-Z0-9]+)&topic=([a-zA-Z0-9]+)$
RewriteRule ^index\.php$ http://www.q-visions.de/tutorial/%1/%2? [L,R=301]

aber in der ersten RewriteCond scheint der Fehler zu sein, weil es ja nicht nach dem "leeren parameter" tutorial endet sondern noch einer folgt. Wie geht man in diesem Fall vor?

Grüße

05.07.2012 17:46

8 Jörg

Du kannst den gleichen Ausdruck verwenden, wie in der RewriteCond dadrunter, nur halt ohne runde Klammern:

RewriteCond %{THE_REQUEST} /index\.php\?site=tutorial&category=[a-zA-Z0-9]+&topic=

Der Dateiname alleine würde aber auch schon reichen:

RewriteCond %{THE_REQUEST} /index\.php

Es geht bei dieser Bedingung ja lediglich um Verhinderung der Endlosweiterleitung

05.07.2012 18:38

9 Helgon

Vielen, vielen Dank!

Funktioniert perfekt und ist genau was ich gesucht habe.

Tausend Dank!

05.07.2012 21:10

10 Helgon

Hi, mir ist jetzt noch etwas eingefallen. Wie fummelt man da jetzt noch rein, dass wenn man z.B. die about.php direkt aufruft auch auf die /about kommt?

Bisher dekts ja ab, dass aus index.php?site=about /about wird

RewriteCond %{THE_REQUEST} /index\.php\?site=about
RewriteCond %{QUERY_STRING} ^site=about$
RewriteRule ^index\.php$ http://www.q-visions.de/about? [L,R=301]

Danke im Voraus

Freundlichste Grüße!

11.07.2012 04:14