Seite 1 von 1

ReWriteRule für 2 Parameter gesucht

Verfasst: 18.04.2009, 11:51
von Commander
Hallo, ich benötige eine Regel die 2 Parameter umfasst. Vielleicht kann mir da jemand helfen. ich habe es irgendwie nicht geschafft. Deswegen möchte ich meine fehlerhaften Versuche lieber nicht als Vorlage präsentieren sondern lieber die Regel die bereits läuft und funktioniert.

Bisher wende ich diese Regel an:

Code: Alles auswählen

ReWriteBase /
ReWriteRule ^((([A-Z][a-z]*)-?([0-9]{0,4}))+)$			homepage.php?page=$1
um eine solche Umformung vorzunehmen:

www.eidam-und-partner.de/Abc-1234
<--->
www.eidam-und-partner.de/homepage.php?page=Abc-1234

Nun soll ein zweiter Parameter für unterschiedliche Sprachen hinzukommen. (2-3 Buchstaben)
--------------------------------------------------------------------------------
www.eidam-und-partner.de/en/Abc-1234
<--->
www.eidam-und-partner.de/homepage.php?page=Abc-1234&lang=en

Wie muss die Regel dafür lauten?

Grundsätzlich müssen am Ende beide Arten funktionieren. Soll heißen:
Es kommt vor das nur 1 Parameter (?page=...) ODER 2 Parameter (?page=...&lang=...) verwendet werden. Also alte und neue Variante sollten funktionieren.

Wer ist so nett und hilft mir.

Verfasst:
von
SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


Re: ReWriteRule für 2 Parameter gesucht

Verfasst: 18.04.2009, 20:39
von Mork vom Ork
Commander hat geschrieben:Bisher wende ich diese Regel an:

Code: Alles auswählen

ReWriteBase /
ReWriteRule ^&#40;&#40;&#40;&#91;A-Z&#93;&#91;a-z&#93;*&#41;-?&#40;&#91;0-9&#93;&#123;0,4&#125;&#41;&#41;+&#41;$			homepage.php?page=$1
Nur fürs Protokoll: Da sind ein paar runde Klammern zu viel bzw. lediglich für Dekorationszwecke zu gebrauchen.

Die gleiche Funktionalität erreichst du mit ^(([A-Z][a-z]*-?[0-9]{0,4})+)$ (zwei Paare weniger), und für die Vorlage Abc-1234 reicht auch ^([A-Z][a-z]*-?[0-9]{0,4})$ (mit der +-Klammer passt es auch auf Abc-1234Xyz-789 - willst du das?).
www.eidam-und-partner.de/en/Abc-1234
<--->
www.eidam-und-partner.de/homepage.php?page=Abc-1234&lang=en

Wie muss die Regel dafür lauten?

Grundsätzlich müssen am Ende beide Arten funktionieren.
Dazu fügst du einfach direkt nach dem ^ (= Beginn des Textes) den neuen Musterteil ein, der auf die Sprache passen soll.

RewriteRule ^(?:([a-z]{2,3})/)?([A-Z][a-z]*-?[0-9]{0,4})$ homepage.php?page=$2&lang=$1

Der innere grüne Teil ist das eigentliche Muster für deine zwei oder drei Kleinbuchstaben. Er ist in eine runde Klammer gefasst, damit du ihn in der Ziel-URL mit $1 einfügen kannst.

Der äußere rote Teil beinhaltet zum einen den trennenden Schrägstrich und sorgt zum zweiten mit dem Fragezeichen am Ende, außerhalb der runden Klammer, dafür, dass dieser ganze Teil optional ist (? = voriges Objekt, in diesem Fall unsere runde Klammer, darf ein- oder keinmal vorkommen).
Die ?:-Kombination am Anfang der roten runden Klammer ist für das Funktionieren nicht wichtig, sie sorgt lediglich dafür, dass diese runde Klammer, anders als bei runden Klammern üblich, nicht in einer $-Variablen landet. Mit ?: lauten die Ziel-Parameter ?page=$2&lang=$1, ohne würden sie ?page=$3&lang=$2 lauten, es würde sich also alles um eins verschieben, da noch eine runde Klammer dazugezählt werden müsste. Wie schon angedeutet: reine Kosmetik.

Du verwendest hier dasselbe Muster sowohl für URLs mit Sprache als auch solche ohne. Falls keine Sprache angegeben ist, wird der URL-Parameter lang leer sein. Beachte dies bei der Prüfung in homepage.php; isset($_GET["lang"]) wird immer wahr sein, um festzustellen, ob keine Sprache angegeben wurde, musst du explizit auf $_GET["lang"] == "" testen.