htaccess leitet zu url.php weiter

htaccess leitet zu url.php weiter

Ich wollte die folgende URL www.example.com/userprofile.php?username=username Unten www.example.com/username
ist meine htaccess-Datei

Options All -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]
RewriteRule ^(.*)$ userprofile.php?username=$1 [QSA]

Wenn ich www.example.com/usernameden GET-Benutzernamen eingebe, wird Folgendes angezeigt:

username.php

Ich habe alles versucht, aber keine Lösung gefunden.
Jede Hilfe ist willkommen.

Antwort1

Wenn ich www.example.com/usernameden GET-Benutzernamen eingebe, wird Folgendes ausgegeben:username.php

Weil Sie vorher in der Datei eine Umschreibung vorgenommen haben:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

das umschreibt /username(jede Anfrage, die keiner vorhandenen Datei zugeordnet ist) in/username.php VorUmschreiben in userprofile.php?username=username.php. Daher wird der GET-Parameterwert mit einem .phpSuffix angezeigt.

Ebenso RewriteRulebewirken die folgenden beiden Anweisungen derzeit nichts, da die Anforderung von der vorherigen Regel abgefangen wird.

RewriteRule ^([^\.]+)$ $1index [NC,L]
RewriteRule ^([^\.]+)$ $1login [NC,L]

Und diese würden nur dann mit der Umschreibung von „Benutzername“ in Konflikt geraten, wenn wir die vorhergehende Umschreibung ändern, um die .phpErweiterung anzuhängen. Aber diese beiden Regeln stehen auch im Konflikt miteinander – Sie gleichen mit beiden dieselbe URL ab – die erste Regel würde immer gewinnen. (Eine Eingabe mit zwei unterschiedlichen Ausgaben ist in keinem Szenario möglich.) Tatsächlich wird dies wahrscheinlich eine Umschreibschleife erzeugen.

Diese beiden Richtlinien sollten entfernt werden.


Um zu vermeiden , dass die Datei .phpangehängt wird username, können Sie überprüfen, ob sie .phpexistiert.VorUmschreiben. Zum Beispiel:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Ich würde jedoch auch in Betracht ziehen, Ihre URL-Struktur zu ändern, damit Sie URLs, die explizit einen Benutzernamen angeben, problemlos ansprechen können. Beispiel:

www.example.com/u/username

Dann kann Ihre Direktive weniger mehrdeutig geschrieben werden (und wäre nicht so stark von der Reihenfolge der Direktiven in Ihrer Datei abhängig):

RewriteRule ^u/(.*)$ userprofile.php?username=$1 [QSA,L]

Seien Sie außerdem genauer in dem regulären Ausdruck, der den Benutzernamen erfasst. Das Muster .*erfasstirgendetwas. Wenn Benutzernamen beispielsweise nur die Buchstaben a..z enthalten dürfen, verwenden Sie einen regulären Ausdruck wie ^u/([a-z]+)$. Und wenn Benutzernamen 4 oder mehr Zeichen lang sein müssen, dann: ^u/([a-z]{4,})$.

verwandte Informationen