Was bedeutet dies Zeilenfolge in der .htaccess?
bearbeitet von Rolf BHallo Gerhard,
[Lektüre zum Ausdrucken und unter's Kopfkissen legen](https://httpd.apache.org/docs/2.4/rewrite/). Ich lege Dir vor allem die Introduction an's Herz.
[RewriteCond](https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewritecond) gibt Regeln vor, unter denen eine nachfolgende [RewriteRule](https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule) zu beachten ist.
In deinem Beispiel gibt's zwei RewriteRules, jede mit einer RewriteCond.
"Quelltext hier" ist keine Apache Direktive, diese Zeile dürfte in einer .htaccess nichts zu suchen haben.
RewriteCond hat zwei bis drei Parameter.
Parameter 1: Der zu testende String. Bei Dir in beiden Fällen `%{REQUEST_URI}`. Das bezeichnet den Inhalt der Servervariablen `REQUEST_URI`, das ist das, was der Browser vom Server per HTTP anfordert (also alles ab dem / Zeichen, was hinter dem Domain-Namen steht).
Parameter 2: Das Muster, das auf den String passen soll.
Das Ausrufezeichen vorneweg ist ein "Nicht", die erste RewriteCond trifft also zu, wenn die URI nicht die Zeichenkette "php" enthält. Ganz schön leichtsinnig, es würde dazu führen, dass eine URI wie `/php-beispiele/` von der Regel abgewiesen wird.
Die zweite RewriteCond hat eine etwas komplexere Regex, die auf URIs wie *dings*/*bums*.php zutrifft. Aber auch hier ist wieder Vorsicht geboten, die Regex endet nicht auf $ (was dem Ende des Teststrings entsprechen würde) und deshalb würde sie auch auf /sample/test.phpdemo/hugo.png zutreffen!
Ich kann Dir hier nicht alles über Regexe erklären. Unser Wiki hat [hier](https://wiki.selfhtml.org/wiki/Regul%C3%A4rer_Ausdruck) eine Einstiegsseite dazu mit Links, und etwas mehr Infos zu Regexen in JavaScript. JavaScript-Regex und die vom Apache verwendeten PCRE-Regex sind ähnlich, aber nicht identisch. Die Apache Doku verlinkt für PCRE-Regex [hierher](http://pcre.org/), eine gut gepflegte Spielwiese gibt's [hier](https://regex101.com/).
Die RewriteRule ist dann wieder ein Suchen und Ersetzen. Der Suchstring ist in beiden Fällen ^(.*)$ - was das gleiche sein dürfte wie %{REQUEST_URI}. Die Klammern in der Regex bilden darüber hinaus eine Match-Gruppe, auf die man im Ersetzungsstring mit $1 zugreifen könnte. Tut das Beispiel aber nicht, es verwendet %1, was sich auf die Matches von RewriteCond bezieht.
Im Falle der ersten RewriteRule dürfte das ein Schlag ins Wasser sein, weil sie ja dann zutrifft, wenn es keinen Match gibt. Ich habe keinen Spiel-Apache da, aber es gibt eine [htaccess Spielwiese](https://htaccess.madewithlove.be/) und die besagt, dass dann einfach %1 stehen bleibt. Hinzu kommt, dass ein Zugriff wie `http://example.org/test` ebenfalls zu Müll führt, denn die RewriteRule macht daraus `/testindex.php` statt `/test/index.php`.
Im Fall der zweiten RewriteRule wird kein Schaden angerichtet, weil der Ersetzungsstring "-" ist. Das bedeutet: "Nichts ersetzen".
In beiden Fällen wird aber noch eine Option gesetzt: E. Das steht für Environment, d.h. im Server wird eine Umgebungsvariable MyAkt_Seite gesetzt. Im Fall der ersten Cond/Rule Gruppe auf index, bei der zweiten Cond/Rule Gruppe auf %1, das ist die erste Matchgruppe der Regex der RewriteCond. Also der Name der PHP Datei, ohne das PHP und ohne den Pfad.
Als Nichtindianer glaube ich etliche Stellen zu sehen, die falsch oder unvollständig behandelt werden. Aber das kann auch an meinem Halbwissen liegen…
_Rolf_
--
sumpsi - posui - obstruxi