Die Verwendung von Variablen als Ordnernamen in der .htaccess-Datei führt zu einem internen Serverfehler 500
Wenn ein Benutzer /geo/anchorage.json
von meinem Server anfordert, versuche ich, Daten von ihm bereitzustellen/geo/a/n/c/anchorage.json
Ich habe diese Regel in meine .htaccess
Datei geschrieben, aber sie verursacht einen 500-internen Serverfehler.
RewriteRule ^geo/((.)(.)(.).+)\.json /geo/$2/$3/$4/$1.json [QSA,L]
Ich habe die Regel in Teile zerlegt und den ersten Teil mit einem PHP-Skript getestet, um die Parameter auszugeben, und das hat gut funktioniert.
RewriteRule ^geo/((.)(.)(.).+)\.json /geo/test.php?2=$2&3=$3&4=$4&1=$1 [QSA,L]
Es scheint, als ob es der letzte Teil ist, der den Fehler verursacht, aber ich kann nicht finden, was ich falsch mache. Ich habe überprüft, dass /geo/a/n/c/anchorage.json
es auf dem Server existiert. Gibt es Besonderheiten bei der Verwendung von Variablen als Ordner?
Antworten
Die resultierende URL /geo/a/n/c/anchorage.json
stimmt auch mit der eingegebenen Regex ( ^geo/((.)(.)(.).+)\.json
) überein, sodass Sie eine Rewrite-Schleife erhalten (Fehler 500). Sie können die Rewrite-Schleife vermeiden, indem Sie in Ihrer Regex spezifischer vorgehen. z.B. Anstelle eines beliebigen Zeichens ( .
) können Sie auch alles finden, was kein Schrägstrich ( [^/]
) ist.
Mit anderen Worten, versuchen Sie Folgendes:
RewriteRule ^geo/((.)([^/])([^/])[^/.]+)\.json$ /geo/$2/$3/$4/$1.json [QSA,L]
Ich habe die erste einfangende Gruppe als .
(Punkt) gelassen, da das sowieso kein Schrägstrich sein konnte.
Sie können diese Regel verwenden, um Ihr Problem zu beheben:
RewriteRule ^(geo)/((\w)(\w)(\w).*\.json)$ $1/$3/$4/$5/$2 [NC,L]
Es ist nicht erforderlich, das QSA
Flag zu verwenden, da Sie die Abfragezeichenfolge nicht ändern.