ChrisB: HTACCESS-Rewrite: Rule-Regex gibt $1 = "index" zurück.

Beitrag lesen

Hi,

RewriteRule ^(\w{1,6}).*$ index.php?kategorie=mitarbeiter&seite=$1

In diesem Regex ging es mir darum, alle Buchstaben des Dateinamens bei in den GET des Indexes zu übertragen. Da längerer Mitarbeiternamen intern auf 6 Buchstaben gekürtzt sind und in der CleanURI ausgeschrieben werden, will ich einfach nur die ersten 6 Buchstaben der CleanURI wissen.
Jedoch wird immer eingabenunabhängig die Seite "index.php?kategorie=personalia&seite=index" aufgerufen.

Wenn Rewriting per htaccess konfiguriert wird, dann schreibt der Apache den Request intern um - und startet dann eine neue Runde, in der er den gerade umgeschriebenen Request so behandelt, als wäre er ein neu heringekommener.

Eine Anfrage nach /blahblubb wird also zunächst in /index.php?kategorie=mitarbeiter&seite=blahbl umgeschrieben;
und dann wird /index.php?kategorie=mitarbeiter&seite=blahbl wiederum durch die Maschinerie geschickt.
/index.php?... enthält fünf Zeichen, die der Zeichenklasse \w entsprechen - nämlich index, der nachfolgende Punkt nicht mehr. Also wird dieser Request jetzt wiederum auf /index.php?kategorie=mitarbeiter&seite=index umgeschrieben.
Eigentlich müsstest du damit sogar in einer Endlosschleife landen.

Ich habe versucht als Mengenangabe für \w {6,6} angegeben, dann funtzt's wie vorgesehen.

/index.php beginnt ja auch nicht mit genau 6 Zeichen, die \w erfüllen.

An einfachsten löst du das mit einer vorgeschalteten RewriteCond, die den REQUEST_URI untersucht - und ihn entweder darauf überprüft, dass er nicht auf index.php lautet; oder vielleicht besser noch, dass die nachfolgende Regel nicht befolgt wird, wenn er zu einer physisch existenten Datei (oder einem Verzeichnis) passt - siehe dazu die möglichen Flags der RewriteCond.

ErrorDocument 404 http://univie.ac.at/skandinavistik/service/umleitung.php

(Das "ErrorDocument 404" gehört natürlich nicht dazu, aber ist eben auch in dieser Datei enthalten)

Das solltest du *so* übrigens nicht angeben - denn die Angabe einer Adresse inkl. http:// löst einen Redirect aus. Der Client fordert dann http://univie.ac.at/skandinavistik/service/umleitung.php mit einem neuen Request an, und wird wahrscheinlich einen HTTP STatuscode 200 bekommen - und der eigentlich wichtige (bspw. für Suchmaschinen, aber auch andere Clients) Status 404 geht verloren.

MfG ChrisB

--
Light travels faster than sound - that's why most people appear bright until you hear them speak.