ChrisB: 2 Variablen per .htaccess an PHP übergeben (RegEx)

Beitrag lesen

Hi,

Weder mit

RewriteRule ^*$ ?SeitenParameter1=$1

noch mit

RewriteRule ^([*]*)$ ?SeitenParameter1=$1

oder mit

RewriteRule ^([A-Za-z0-9_-/:.]*)$ ?SeitenParameter1=$1

Warum nicht?

Weil Rewriting im Kontext von .htaccess immer „neu gestartet” wird, bis es nichts mehr zum Umschreiben gibt. (Das ist anders, wenn es in der zentralen Server-Konfiguration … nun ja, konfiguriert wurde.)

Betrachten wir mal beispielshabler nur die erste Rule die du angeführt hast, mit den anderen verhält es sich analog:

Was du hier also hast, ist dass dein Request nach /foo-bar rein kommt, und deine RewriteRule matched (sie matched auf foo-bar, der führende Slash wird nicht betrachtet) – und dein Request wird umgeschrieben zu /?SeitenParameter1=foo-bar. So, keine weiteren Regeln, wir sind fertig – für *diese* Runde.

Aber, weil wegen siehe oben – es wird eine neue Runde gestartet, mit dem neuen internen Request, /?SeitenParameter1=foo-bar.
Die RewriteRule betrachtet bekanntlich nur die path-Komponente des URL, das ist hier nichts weiter als / – und da der führende Slash ignoriert wird, betrachten wir hier letztendlich nur noch einen *leeren* Pfad. Auf den matched jeder deiner aufgeführten regularen Ausdrücke, weil du alles was deine verschiedenen Muster abdecken ja nur *optional* verlangst, durch den Stern-Quantifier.

Also erfolgt jetzt ein Umschreiben auf /?SeitenParameter1= – deinen leeren Pfad findest du hinter dem Gleichheitszeichen wieder. Und so geht’s dann weiter, in die nächste Runde (eigentlich müsstest du hier einen Fehler bekommen, dass das Umschreiben nicht beendet werden konnte – aber abhängig von der weiteren Konfiguration kann der u.U. auch ausbleiben).

Was du dagegen machen kannst – nun, da gibt’s unterschiedliche Ansätze und Möglichkeiten.

  • Du könntest einen leeren Pfad ausschließen, in dem du mit + statt * einen mindestens ein Zeichen langen Match verlangst.

  • Du könntest statt auf ?SeitenParameter1= explizit auf index.php?SeitenParameter1= umleiten, und das Umschreiben nur unter der Bedingung stattfinden lassen, dass index.php im Request-Path *nicht* vorkommt.

Was oft gemacht wird, ist nur umzuschreiben, wenn der Request nicht zu einer vorhandenen Datei oder einem vorhandenen Verzeichnis aufgelöst werden kann – mit RewriteConds vor der RewriteRule, die das mit den Flags -d/-f bzw. deren Negierungen vorab überprüfen.

Das ist *üblicherweise* genau der Fall, den man haben will – physisch als Dateien vorhandene Ressourcen (Bilder, Scripte, Stylesheets, …) werden nicht umgeschrieben, sondern der Default-Auslieferungsmechanismus des Apachen beantwortet diese Requests mit dem jeweiligen Dateiinhalt.

Und alles andere, für das nichts physisch vorhanden ist, schreibt man um auf das Script, das dann den passenden Inhalt aus einer anderen Datenquelle (z.B. der Datenbank) heraussucht, und den Request dann selber mit diesem Inhalt beantwortet.

MfG ChrisB

--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?