Mod Rewrite + Rewrite Condition für den Anfang der Request-URI
sprite
- programmiertechnik
Hallo ihr Lieben,
ich möchte bald mit einer Seite durchstarten, deren Inhalte mehreren Sprachen abrufbar sein sollen. Aufrufe sehen wie folgt aus:
meineurl.com/de/home(/)
meineurl.com/de/news(/)
meineurl.com/de/news/cat1(/)
meineurl.com/de/news/cat1/page5.html
Analog die Aufrufe für andere Sprachen, einfach das "de"-Kürzel durch das entsprechende Sprachkürzel ersetzt.
Bisher sieht meine .htaccess-Datei wie folgt aus:
RewriteEngine On
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/? index.php?l=$1&content=$2 [L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/? index.php?l=$1&content=$2§ion=$3 [L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/([a-z_0-9]+).html$ index.php?l=$1&content=$2§ion=$3&page=$4 [L]
Funktioniert auch perfekt. Es soll jedoch eine Druckansicht für jede Seite geben, welche per vorangestelltem "print/" abrufbar sein soll. Die Druckansichten für die angegeben Seiten sollen also so abrufbar sein:
meineurl.com/print/de/home(/)
meineurl.com/print/de/news(/)
meineurl.com/print/de/news/cat1(/)
meineurl.com/print/de/news/cat1/page5.html
Und wieder analog die anderen Sprachen: Einfach das "de" durch das entsprechende Sprachkürzel ersetzt.
Leider bin ich ein wenig aufgeschmissen, weil ich bisher noch nichts mit RewriteConditions gemacht habe. Ich denke es müsste irgendwie derartig aussehen:
RewriteCond %{REQUEST_URI} ^(print/)? [C]
...
Wie teile ich der RewriteEngine mit, dass sie, ist ein "print/" vorangestellt, der index.php noch ein Parameter "print" uebergeben soll?
Der interne Aufruf für die Druckansicht ist nämlich:
index.php?print=true&l=..&content=..§ion=..&page=..
Habt ihr mir einen Tip?
Vielen Dank und
Liebe Grüße,
sprite
Hallo sprite!
Bisher sieht meine .htaccess-Datei wie folgt aus:
RewriteEngine On
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/? index.php?l=$1&content=$2 [L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/? index.php?l=$1&content=$2§ion=$3 [L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/([a-z_0-9]+).html$ index.php?l=$1&content=$2§ion=$3&page=$4 [L]Funktioniert auch perfekt.
Sicher?
Falls du aber mal in die Verlegenehit kommen solltest, dass deine URLs auch einen Query String enthalten, dürfte es nicht mehr funktionieren. Ein Einfügen des QSA Flags sollte imho Abhilfe schaffen.
Es soll jedoch eine Druckansicht für jede Seite geben, welche per vorangestelltem "print/" abrufbar sein soll. Die Druckansichten für die angegeben Seiten sollen also so abrufbar sein:
meineurl.com/print/de/home(/)
meineurl.com/print/de/news(/)
meineurl.com/print/de/news/cat1(/)
meineurl.com/print/de/news/cat1/page5.htmlUnd wieder analog die anderen Sprachen: Einfach das "de" durch das entsprechende Sprachkürzel ersetzt.
Habt ihr mir einen Tip?
Warum machst du es nicht analog zu deinen bisherigen Rules?
Alle URLs fangen doch dann mit 'print' an?
Gruß Gunther
Hallo Gunther,
danke für die schnelle Antwort (:
Warum machst du es nicht analog zu deinen bisherigen Rules?
Alle URLs fangen doch dann mit 'print' an?
Habe ich mir überlegt und im Moment wäre es gar nicht so ein riesiger Aufwand, aber in Zukunft werden sicherlich noch weitere RewriteRules dazukommen. Jede Regel zweifach zu haben, nur mit dem Unterschied, dass einer ein print/ vorangestellt wird, finde ich viel zusätzliche Regeln. Ich dachte es lässt sich vielleicht einfacher und schöner lösen.
RewriteEngine On
RewriteRule ^print/([a-z]{2})/([a-z_0-9]+)/? index.php?print=true&l=$1&content=$2 [L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/? index.php?l=$1&content=$2 [L]
RewriteRule ^print/([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/? index.php?print=true&l=$1&content=$2§ion=$3 [L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/? index.php?l=$1&content=$2§ion=$3 [L]
RewriteRule ^print/([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/([a-z_0-9]+).html$ index.php?print=true&l=$1&content=$2§ion=$3&page=$4 [L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/([a-z_0-9]+).html$ index.php?l=$1&content=$2§ion=$3&page=$4 [L]
Falls du aber mal in die Verlegenehit kommen solltest, dass deine URLs auch einen Query String enthalten, dürfte es nicht mehr funktionieren. Ein Einfügen des QSA Flags sollte imho Abhilfe schaffen.
Was mich auf eine Idee bringt: Hier liese sich ohne größeren Schreibaufwand eine Druckansicht einfügen:
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/? index.php?l=$1&content=$2 [QSA,L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/? index.php?l=$1&content=$2§ion=$3 [QSA,L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/([a-z_0-9]+).html$ index.php?l=$1&content=$2§ion=$3&page=$4 [QSA,L]
Durch folgende Aufrufe würde die Druckansicht verwendet, richtig?:
meineurl.com/de/home(/)?print
meineurl.com/de/news(/)?print
meineurl.com/de/news/cat1(/)?print
meineurl.com/de/news/cat1/page5.html?print
Jedoch gefällt mir die erste Variante mit dem vorangestellten print/ besser. Gibt es eine Möglichkeit, diese zu realisieren ohne jede RewriteRule entsprechend zu duplizieren? Gerne auch entsprechende Lektüre-Links (:
Vielen Dank und
Liebe Grüße,
sprite
Hallo sprite!
Warum machst du es nicht analog zu deinen bisherigen Rules?
Alle URLs fangen doch dann mit 'print' an?
Habe ich mir überlegt und im Moment wäre es gar nicht so ein riesiger Aufwand, aber in Zukunft werden sicherlich noch weitere RewriteRules dazukommen. Jede Regel zweifach zu haben, nur mit dem Unterschied, dass einer ein print/ vorangestellt wird, finde ich viel zusätzliche Regeln. Ich dachte es lässt sich vielleicht einfacher und schöner lösen.
Ja, z.B. nur mit einer einzigen RewriteRule und den Rest bspw. in einem PHP-Script. ;-)
Ich beschäftige mich auch seit einiger Zeit mit der Frage des "URL-Designs" und demzufolge auch mit mod_rewrite (was nicht bedeutet, dass ich davon wirklich Ahnung habe).
Einer der gravierendsten Nachteile von mod_rewrite ist, dass sämtliche Dinge außnahmslos bei_jedem_Request abgearbeitet werden müssen, was schnell zu spürbaren Performance-Einbußen führen kann. Ein weiterer Nachteil ist (imho), dass man nicht sehr flexibel ist, und dass die Gefahr unbeabsichtigter "Nebenwirkungen" mit jeder neuen Regel/ Kondition steigt.
Falls du aber mal in die Verlegenheit kommen solltest, dass deine URLs auch einen Query String enthalten, dürfte es nicht mehr funktionieren. Ein Einfügen des QSA Flags sollte imho Abhilfe schaffen.
Was mich auf eine Idee bringt: Hier liese sich ohne größeren Schreibaufwand eine Druckansicht einfügen:RewriteRule ^([a-z]{2})/([a-z_0-9]+)/? index.php?l=$1&content=$2 [QSA,L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/? index.php?l=$1&content=$2§ion=$3 [QSA,L]
RewriteRule ^([a-z]{2})/([a-z_0-9]+)/([a-z_0-9]+)/([a-z_0-9]+).html$ index.php?l=$1&content=$2§ion=$3&page=$4 [QSA,L]Durch folgende Aufrufe würde die Druckansicht verwendet, richtig?:
meineurl.com/de/home(/)?print
meineurl.com/de/news(/)?print
meineurl.com/de/news/cat1(/)?print
meineurl.com/de/news/cat1/page5.html?print
AFAIK muss es sich immer um Paare handeln, also Variablenname=Wert.
Ergo bspw.: print=1
Jedoch gefällt mir die erste Variante mit dem vorangestellten print/ besser. Gibt es eine Möglichkeit, diese zu realisieren ohne jede RewriteRule entsprechend zu duplizieren? Gerne auch entsprechende Lektüre-Links (:
Das ist einer der Punkte, den ich oben mit "nicht flexibel" meinte. Denn imho gibt es da keine (wesentlich) einfachere Möglichkeit, da du für jede Verzeichnistiefe/ Parameteranzahl eine eigene Rule brauchst.
Aber wie gesagt, ich bin nicht der Mod_Rewrite Profi. Falls ich mich irre, oder es andere Möglichkeiten gibt, wird dir hier bestimmt noch jemand anders antworten.
Gruß Gunther