Seite 1 von 1

RewriteRule ohne Angabe aller Parameter

Verfasst: 14.09.2010, 16:58
von Less
Ein herzliches Hallo in die Runde,

ich hänge gerade an einem Mod-Rewrite-Problem:

Bsp. Aufruf:

Code: Alles auswählen

dvds/seite1-release2010-bewertung5-genreAction-altersgruppe16.html
Meine funktionierende RewriteRule:

Code: Alles auswählen

RewriteRule ^dvds/seite([0-9]+)-release([0-9]*)-bewertung([0-9]?)-genre([A-Z]*)-altersgruppe([0-9]*)\.html$ dvds.php?release=$2&bewertung=$3&genre=$4&altersgruppe=$5&seite=$1 [L]
Problem:
Es sollen im Gegensatz zu oben nicht alle Werte zwingend anzugeben sein, so dass auch Aufrufe möglich sind, wie:

Code: Alles auswählen

dvds/seite1-release2010-genreAction.html
Es gibt also über 15 verschiedene Möglichkeiten zur Kombination der einzelnen Parameter.

Frage:
Gibt es dazu nicht eine elegantere Variante, als alle Kombinationen nacheinander in verschiedenen RewriteRules abzufragen?


Ich hoffe ihr könnt mir helfen :)

Beste Grüße

Less :D

Verfasst:
von

Verfasst: 14.09.2010, 20:42
von Rizzo
Moin,

Das ist mal ein schönes Problem.
Nach einem Tag an dem mal wieder nichts klappen will, wie ich möchte, brauch ich sowas.

Code: Alles auswählen

RewriteRule  ^dvds\/(?:seite([0-9]+))?-?(?:release([0-9]{1,4})?)?-?(?:bewertung([0-9]{1})?)?-?(?:genre([a-zA-Z]*))?-?(?:altersgruppe([0-9]+))?-? dvds.php?release=$2&bewertung=$3&genre=$4&altersgruppe=$5&seite=$1 [L]
Das nenn ich mal eine Zeile :D - man sollte sich das als Einzeiler vorstellen -

Die RewriteRule hab ich jetzt erstmal nur unter PHP getestet... aber das Grundprinzip hab ich aus einem meiner Projekte entnommen. Sollte demnach Funktionieren... ABER es ist nur Funktionstüchtig, wenn die Reihenfolge beibehalten wird. Einmal quer durchs Gemüsebeet klappt nicht. :D - siehe Beispiele
Bsp. Funkt

Code: Alles auswählen

dvds/seite1-release2010-bewertung5-genreAction-altersgruppe16.html
dvds/seite1-release2010-bewertung5-genreAction.html
dvds/seite1-release2010-bewertung5.html
dvds/seite1-release2010.html
dvds/altersgruppe16.html
dvds/seite1-genreAction-altersgruppe16.html
...
Bsp. Funkt nicht

Code: Alles auswählen

dvds/genreAction-bewertung5-release2010-altersgruppe16-seite1.html
Wer es eigentlich nicht Ratsammer wenn du die URL mit...

Code: Alles auswählen

dvds/Film-an-und-dazumal_2234.html
...ausrufst? Die Zahl hinten dran kann die UniqueID des Films in der Datenbank sein - zudem du dir die restlichen Informationen wie Seite, Genre, Bewertung, etc. holst. Das erleichtert etwas und sieht meines Erachtens besser aus.

Gruß Rizzo

Verfasst: 14.09.2010, 21:15
von Less
Hallo Rizzo,

Top! Gerade getestet, funktioniert einwandfrei! Hast mir richtig geholfen. Besten Dank! Einfach stark!

Zwei kleine Frage habe ich noch zu deinem Code:

Warum wird am Anfang bei (?:seite([0-9]+))? kein Fragezeichen vor der Klammer gesetzt?

Wofür ist das allerletzte Fragezeichen bei folgendem? ?(?:altersgruppe([0-9]+))?-?
Könnte ich dies auch durch ?(?:altersgruppe([0-9]+))?.html ersetzten?

Zu deinem Vorschlag: Ein Aufruf über
dvds/Film-an-und-dazumal_2234.html geht leider nicht, da nicht eine einzelne DVD-Info aufgerufen werden soll, sondern eine Liste, die den obigen Kriterien entspricht.

Beste Grüße

Less :D

Verfasst: 14.09.2010, 21:55
von Rizzo
Huhu nochmal,

Freut mich das es funktioniert.

Zu deinen Fragen:
Eins vorweg... ein einzelnes Fragezeichen nach einer schließenden Klammer od. Bindestrich bedeutet das der Inhalt 0 oder 1mal vorhanden sein darf.

Code: Alles auswählen

(?:seite([0-9]+))?
- Erklärung - (Versuch)
1.
Die erste Klammer - (?:seite([0-9]+))? - schaut erst einmal ob seite123 vorhanden ist, darum auch das Fragezeichen am Ende. Falls JA wird die innere Klammer (?:seite([0-9]+))? mit den Werten belegt und in der jeweiligen Variablen '$1' abgespeichert. Wenn NEIN geht die innere Klammer leer aus... und speichert ein ''- (nichts) in die Variable '$1'.
Das (?: verhindert bei jedem Suchaufruf das extra Abspeichern von zB: Seite, Gerne, etc. in eine solche Variable.

Das ganze ist eine kleine Mogelpackung, die dennoch zum Erfolg führt.

2.
Hier kannst du das auch mit '.html' schreiben. Sprich:

Code: Alles auswählen

^dvds\/(?:seite([0-9]+))?-?(?:release([0-9]{1,4})?)?-?(?:bewertung([0-9]{1})?)?-?(?:genre([a-zA-Z]*))?-?(?:altersgruppe([0-9]+))?\.html
Der '-?' ist da nicht weiter schlimm. Vielleicht willst du auch weiter anbauen. :D

Hat Spaß gemacht :wink:

Gruß Rizzo

Verfasst: 14.09.2010, 22:07
von Less
Ahh, alles klar! Danke und Danke! :)

Beste Grüße :D

Less