Hilfe bei .htaccess: Weiterleitung von /profil/NUTZERNAME auf /profil/?user=NUTZERNAME

  • Hallo zusammen,


    ich bin neu hier im Forum. Falls ich ein ähnliches Thema übersehen habe oder etwas falsch gemacht habe, lasst es mich bitte wissen.


    Ich nutze das "Webhosting 1000"-Paket und stehe vor folgendem Problem:


    Aktuell kann ich Nutzerprofile über den Link ...de/profil/?user=NUTZERNAME aufrufen. Ich möchte dies aus Gründen der Lesbarkeit auf ...de/profil/NUTZERNAME umstellen.

    Da die Logik hinter ?user=... recht komplex ist und auch auf anderen Seiten genutzt wird, möchte ich diese nicht ändern. Stattdessen plane ich eine interne Weiterleitung über `.htaccess`.


    Meine aktuelle .htaccess-Datei im /profil-Verzeichnis sieht so aus:

    Apache Configuration
    RewriteEngine ON
    RewriteRule ^([^/]+)/?$ /profil/?user=$1 [L]



    Leider führt das zu einem "Internal Server Error". Im Fehlerprotokoll finde ich folgende Meldung:

    Code
    [Mon Nov 18 15:16:32.672840 2024] [core:error] [pid 730435:tid 730435] [client 80.144########:0] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.


    Daraufhin habe ich eine Variante ohne Variable getestet:

    Apache Configuration
    RewriteEngine On
    RewriteRule ^marlon/?$ /profil/?user=marlon [L]



    Damit funktioniert die Weiterleitung: Der Aufruf von ...de/profil/marlon leitet korrekt auf ...de/profil/?user=marlon weiter.


    Ich vermute, dass es ein Problem mit der allgemeinen Regel gibt. Möglicherweise hängt es mit einem deaktivierten mod_rewrite zusammen, aber ich finde keine Möglichkeit, zu überprüfen, ob es aktiv ist.


    Hat jemand eine Idee, wie ich die Regel korrekt umsetzen kann oder wie ich prüfen kann, ob mod_rewrite überhaupt aktiviert ist?


    Vielen Dank im Voraus für eure Hilfe! :)

  • Go to Best Answer
  • MarlonMagDich

    Changed the title of the thread from “RewriteEngine funktioniert nicht” to “Hilfe bei .htaccess: Weiterleitung von /profil/NUTZERNAME auf /profil/?user=NUTZERNAME”.
  • Also mit der RewriteRule bin ich mir nicht sicher, bei deiner ist es jedenfalls so, wie es die Fehlermeldung sagt.

    Das erste mal umschreiben klappt, wird umgeschrieben wie gewünscht. Aber dann wird der neue Request wieder durch die RewriteRule gejagt und umgeschrieben auf ...de/profil/?user=profil. Dann geht es ad infinitum weiter, die letzte URL bleibt zwar bei jedem Rewrite gleich, wird dann halt bei jedem Durchlauf auf sich selbst umgeschrieben. Kann man das nicht auch in den Entwicklertools des Browsers (Netzwerk) sehen?


    Also mod_rewrite ist jedenfalls definitiv aktiv, es liegt an deiner RewriteRule.

    • Best Answer

    Das Fragezeichen ist nicht wörtlich gemeint und sollte deshalb nicht seiner Spezialbedeutung beraubt werden. Es macht den Schrägstrich hinter dem Usernamen optional. Die Regex soll USERNAME und USERNAME/ akzeptieren.


    Ich würde es mit [R,L] versuchen. Die URL ...de/profil/?user=NUTZERNAME sollte nämlich nicht matchen: Der zu vergleichende Teil der URL ist leer, weil alles bis inklusive profil/ und alles ab inklusive ?user= abgeschnitten wird (Unterverzeichnis und Query String). Aber nach dem Umschreiben ist der neue Query String noch nicht uminterpretiert und damit matcht die Regel. Also die neue URL einmal zum Browser schicken. Wenn sie von dort zurückkommt, geht es nicht in eine Schleife.


    Alles ungetestet, viel Glück.

  • Ich habe mir das jetzt mal mit ausführlichem Logging angeschaut. Die Ursache für die Schleife ist eine andere als ich dachte. Tatsächlich ist die Neuinterpretation des Query Strings das Erste, was Apache macht. Die wahre Ursache hat mit Subrequests und mod_dir zu tun, aber der Ablauf ist sehr unübersichtlich. Wenn man den Redirect extern abhandelt, gibt es keinen Subrequest und die Versuche mit den DirectoryIndex-Files durchlaufen nicht die RewriteRule. Aber bei einem internen Redirect wird die URL mit index.html bzw. index.php als Subrequest nochmal durch die Rewrite-Regel geschickt, und die matcht dann und das führt in eine Schleife. Man kann das wie oben beschrieben mit dem externen Redirect vermeiden.


    Wenn man den Redirect intern haben möchte, damit die lesbarere URL beim User stehenbleibt, dann muss man verhindern, dass die Rewrite-Rule auf index.html oder index.php (oder was man sonst als DirectoryIndex definiert hat) anschlägt. Wenn die Usernamen z.B. keine Punkte enthalten, erweitert man die Regel einfach so: ^([^./]+)/?$. Wenn die Usernamen Punkte enthalten, kann man nur genau das Index-Script so ausschließen:

    Apache Configuration
    DirectoryIndex index.php
    RewriteEngine ON
    RewriteCond %{REQUEST_URI} !index\.php$
    RewriteRule ^([^/]+)/?$ /profil/?user=$1 [L]