Die Verwendung von Variablen als Ordnernamen in der .htaccess-Datei führt zu einem internen Serverfehler 500

Jul 28 2020

Wenn ein Benutzer /geo/anchorage.jsonvon meinem Server anfordert, versuche ich, Daten von ihm bereitzustellen/geo/a/n/c/anchorage.json

Ich habe diese Regel in meine .htaccessDatei 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.jsones auf dem Server existiert. Gibt es Besonderheiten bei der Verwendung von Variablen als Ordner?

Antworten

2 MrWhite Jul 29 2020 at 04:09

Die resultierende URL /geo/a/n/c/anchorage.jsonstimmt 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.

2 anubhava Jul 29 2020 at 05:14

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 QSAFlag zu verwenden, da Sie die Abfragezeichenfolge nicht ändern.