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/username
den 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/username
den 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 .php
Suffix angezeigt.
Ebenso RewriteRule
bewirken 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 .php
Erweiterung 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 .php
angehängt wird username
, können Sie überprüfen, ob sie .php
existiert.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,})$
.