Claudius L.: Variable in RewriteRule nutzen

Beitrag lesen

Hey!

Mein eigentliches Ziel sind Clean URIs

OK, aber warum dann ein Bestandteil (page), der keine wirkliche Bedeutung hat, also die "saubere" URL "verunreinigt"?

Wegen folgendem Beispiel:

example.test/seiteeins
example.test/seitezwei

Diese beiden Anfragen sollen intern auf example.test/index.php weitergeleitet werden. Dazu fallen mir spontan zwei Möglichkeiten ein:

RewriteRule ^seiteeins|seitezwei$ index.php
RewriteRule .* index.php

Beide Lösungen gefallen mir nicht.
Die erste deshalb, weil, wenn irgendwann eine "seitedrei" dazukommt, diese in der .htaccess extra hinzugefügt werden muss. Hier käme ein von dir Erwähntes Config-Skript ins Spiel.
Die zweite missfällt mir, weil dann auch example.test/img/image.jpg auf /index.php weitergeleitet wird. Und selbst wenn ich mit einer RewriteCond prüfe, ob eine existierende Datei oder ein Verzeichnis angefordert wird, so entstehen immer noch Probleme, wenn versehentlich mal eine Seite "img" angelegt und example.test/img  angefordert wird - da unklar ist, ob example.test/img ein Verzeichnis oder eine Unterseite ist.
Deshalb meine Vorliebe für "verunreinigte" Clean URIs. Wenn ich festlege "alle meine Mehr-Oder-Weniger-Clean-URIs beginnen mit page/" und "page/ darf kein physikalisches Verzeichnis sein, zumindest keines, das per HTTP erreichbar sein muss", kann ich bedenkenlos alles, was ^page/.*$ matcht auf /index.php weiterleiten.
Wichtig dabei ist, dass das PHP-Skript erfährt, wie der Clean-URI-Präfix (hier "page/") heißt, damit es den Request richtig verarbeiten kann.
Mit meinem Ansatz

RewriteRule ^(page/).*$ index.php [E=PAGES_DIRECTORY:$1]

hatte ich dieses Problem beinahe gelöst, eben bis auf Requests, bei denen index.php aufgerufen wird, ohne das obige RewriteRule greift - also bei / und /index.php.

Jedenfalls hab ich nun dein Anliegen insoweit verstanden - nur keine Lösungsidee.

Schade, das ist neu. ;-)
Ich hatte inzwischen selbst eine Idee, die jedoch auch nicht zum Ziel führte:

RewriteRule ^($|index.php$|(page/).*)$ index.php [E=PAGES_DIRECTORY:$2]

Erhofft hatte ich mir, dass dieses Pattern bei allen Requests greift, die entweder direkt auf / gehen, auf /index.php oder auf /page/.* und in jedem Fall REDIRECT_PAGES_DIRECTORY den Wert "page/" erhält. Leider ist das nicht der Fall. Beim Zugriff auf /index.php ist REDIRECT_PAGES_DIRECTORY nicht gesetzt, beim Zugriff auf / ist es ein leerer String.
Fällt dir dazu vielleicht etwas ein?

Außer, ein Setup-/Config-Script zu schreiben, das die Änderung an all den Stellen einträgt, an denen das notwendig ist.

Das ist eine denkbare Lösung, die ich aber gerne vermeiden würde. Ich denke, im Vergleich dazu ist der Aufwand, "page/" an zwei Stellen zu schreiben, geringer …

Viele Grüße,

Claudius