Zur Navigation

.htaccess Weiterleitung per 301 alte auf neue Seite [7]

61 christa

noch ne Frage aufgekommen: kann man mit nur einem Term id=455 bis 724 definieren?

irgendwie so?

RewriteCond %{QUERY_STRING} id=455-724 (&|$) [OR]

02.07.2013 16:58

62 Jörg Kruse

Mit dem Leerzeichen vor dem "(&|$)" erzeugst du vermutlich einen Server Error.

Dieses Muster:

id=455-724(&|$)

ist in folgenden Query Strings enthalten:

id=455-724

id=455-724&bla=blub

kann man mit nur einem Term id=455 bis 724 definieren?

Du benötigst dafür mindestens fünf Bedingungen:

RewriteCond %{QUERY_STRING} id=45[5-9](&|$) [OR]
RewriteCond %{QUERY_STRING} id=4[6-9][0-9](&|$) [OR]
RewriteCond %{QUERY_STRING} id=[5-6][0-9]{2}(&|$) [OR]
RewriteCond %{QUERY_STRING} id=7[0-1][0-9](&|$) [OR]
RewriteCond %{QUERY_STRING} id=72[0-4](&|$)

02.07.2013 17:50

63 christa

es gibt ca. 1400 ids, davon werden ca. 300 per 301 weitergeleitet auf die neuen IDs der neuen DB, der große Rest soll auf die 404.php geleitet werden.
Handelt htaccess die RewriteConditions sequentiell ab? Könnte ich die 300 Weiterleitungen in der htaccess voranstellen und danach alle 1400 auf die 404.php leiten. Immer unter dem Aspekt, dass die 300 zuerst weitergeleitet werden und unten gar nie ankommen, da sie schon oben weitergeleitet wurden.
Unten kommen dann nur jene an, die oben die RewriteCondition nicht erfüllten. Diese würden dann auf die 404.php weitergleitet.

So müsste ich nicht die vielen Löcher in der Reihe definieren, sondern würde ein einfaches Filter mittels der Reihenfolge erstellen. Müsste doch eigentlich funktionieren, oder nicht?

Beispiel:

RewriteCond %{QUERY_STRING} opt_id=1153
RewriteRule \.php$ ../viren/opt.php?ID=177 [R=301,L]
ca.300 weitere

dann

RewriteCond %{QUERY_STRING} id=[1-9][0-9]{2}(&|$) [OR]   (id=100-999)
RewriteCond %{QUERY_STRING} id=1[0-4]{3}(&|$)                (id=1000-1444)
RewriteRule \.php$ ../verz/404.php [L]

Was meint der Spezialist dazu?

02.07.2013 20:02

64 Jörg Kruse

Die RewriteRules werden nacheinander abgearbeitet, bis zum Ende oder bis eine Rule zutrifft, bei welcher ein L-Flag gesetzt ist.

Dieser Ausdruck:

id=1[0-4]{3}(&|$)

... trifft nicht auf IDs zu, die eine Zahl größer 4 enthalten. Also id=1229 ist hier nicht enthalten! id=1230 dagegen schon

Den Bereich 1000 bis 1444 kannst du in drei Bereiche aufteilen:

1000 - 1399
1400 - 1439
1440 - 1444

Dafür kannst du dann jeweils geeignete Bedingungen formulieren

03.07.2013 11:34

65 christa

dann nehme ich besser:

RewriteCond %{QUERY_STRING} opt_id=1153
RewriteRule \.php$ ../viren/opt.php?ID=177 [R=301,L]
ca.300 weitere

RewriteCond %{QUERY_STRING} id=[1-9][0-9]{2}(&|$) [OR]   (100-999)
RewriteCond %{QUERY_STRING} 1[0-9]{3}(&|$)                      (1000-1999)

denn nach oben ist eh alles zugelassen, auch wenn es die ids gar nicht gibt
Ist der Ausdruck so ok.? Das wäre, so glaube ich, die kürzeste Form und würde meine .htaccess erheblich schlanker machen.

03.07.2013 15:57

66 Jörg Kruse

Die Kommentare würde ich mit einem # einleiten und in eine jeweils eigene Zeile unterbringen, dann kann man den Inhalt des Codeblocks in die .htaccess Datei kopieren, ohne dass es "knallt" :)

# ca.300 weitere

# 100-999:
RewriteCond %{QUERY_STRING} id=[1-9][0-9]{2}(&|$) [OR]

Hier fehlt wohl noch ein "id=":

RewriteCond %{QUERY_STRING} 1[0-9]{3}(&|$)

Hier stellt sich noch die Frage, ob du opt_id= und id= voneinander abgrenzen solltest - denn letzteres ist in ersterem enthalten:

RewriteCond %{QUERY_STRING} opt_id=1153

Dazu könntest du in der anderen Rule vorne auch noch Begrenzungszeichen definieren:

RewriteCond %{QUERY_STRING} (^|&)id=[1-9][0-9]{2}(&|$) [OR]

... also dass vor dem "id" nichts oder ein & steht (aber kein "opt_")

03.07.2013 23:03 | geändert: 03.07.2013 23:05

67 christa

ja id vergessen... das andere war nur andeutungsweise. Guter Tipp wegen id/ID Abgrenzung.


Die fertige Formel hieße dann:


RewriteCond %{QUERY_STRING} opt_id=1153
RewriteRule \.php$ ../viren/opt.php?ID=177 [R=301,L]


#für alles was oben nicht erfüllt wird, wird nachfolgend die 404 geliefert

#(id=100-999)
RewriteCond %{QUERY_STRING} (^|&)id=[1-9][0-9]{2}(&|$) [OR]
 
#(id=1000-1999)
RewriteCond %{QUERY_STRING} (^|&)id=1[0-9]{3}(&|$)  

#Ausgabe 404.php                   
RewriteRule \.php$ ../verz/404.php [L]

ok so?

04.07.2013 08:29

68 Jörg Kruse

Ich würde die .htaccess Datei mit verschiedenen URLs testen, um zu sehen, ob sie genau das tut, was sie tun soll.

04.07.2013 11:52

69 christa

Zitat von Jörg
Ich würde die .htaccess Datei mit verschiedenen URLs testen, um zu sehen, ob sie genau das tut, was sie tun soll.

das mache ich immer

04.07.2013 12:00

70 christa

Hallo Jörg

Filter scheint zu funktionieren, Test-urls werden den Anforderungen entsprechend weitergereicht, entweder auf die neuen IDs oder auf die 404.php
Mal sehen ob ich alle ids erwischt habe. Jedenfalls funktioniert die Weiche.

Besten Dank für Deine Hilfe

04.07.2013 17:49