Ich habe viel nachgeprüft, um meine Frage zu beantworten. Es gibt einige, die meiner Frage nahe kommen, aber keines, das mein Problem lösen würde.
Ich muss ALLE URLs, die so enden, dauerhaft umleiten:
?mode=list
UND
?mode=grid
zu ohne (Fragezeichen und den Inhalt danach entfernen)
Beispiel:
example.com/random-url-here?mode=grid redirect to example.com/random-url-here
UND
example.com/whatever-url-here?mode=list redirect to example.com/random-url-here
Ich habe Folgendes versucht:
RewriteEngine on
RewriteRule (.*)$^mode=list $1
RewriteRule (.*)$^mode=grid $1
und das
RewriteEngine on
RewriteRule (.*)$^mode=list $1 [L,R=301]
RewriteRule (.*)$^mode=grid $1 [L,R=301]
Aber es funktioniert nicht. Offensichtlich verstehe ich nicht, wie das funktioniert. Bitte helfen Sie.
Danke
Antwort1
example.com/random-url-here?mode=grid
Der Teil der URL nach dem ersten ?
(in diesem Beispiel also mode=grid
) heißtAbfragezeichenfolge.
RewriteRule (.*)$^mode=list $1 [L,R=301]
Die RewriteRule
Direktive akzeptiert bis zu 3 Argumente:
RewriteRule pattern substitution [flags]
DerMuster(erstes Argument) der RewriteRule
Direktive ist ein regulärer Ausdruck (regex), der mit dem angeforderten übereinstimmtNur URL-Pfad, wodurch die Abfragezeichenfolge ausgeschlossen wird. Daher können Sie die Abfragezeichenfolge mithilfe der RewriteRule
Direktive nicht abgleichen.
Um die Abfragezeichenfolge abzugleichen, müssen Sie eine zusätzliche RewriteCond
(Bedingungs-)Direktive verwenden und anhand der QUERY_STRING
Servervariable prüfen. RewriteCond
Direktiven geltenBedingungender RewriteRule
folgenden Richtlinie.
Allerdings (.*)$^mode=list
wird der reguläre Ausdruck (abgesehen vom Versuch, die Abfragezeichenfolge abzugleichen)niemalsÜbereinstimmung in diesem Kontext. $
bestätigt das Zeilenende und ^
den Zeilenanfang – dies wird also immer fehlschlagen.
In Ihrem obigen Beispiel ist die $1
Rückreferenz (in derErsetzungszeichenfolge) versucht, den URL-Pfad abzugleichen. Dieser URL-Pfad (in einemVerzeichnisKontext, d. h. .htaccess
) beginnt nicht mit einem Schrägstrich (d. h. es istrelativ), führt also zu einer fehlerhaften Weiterleitung, sofern Sie nicht auch RewriteBase
an anderer Stelle in Ihrer .htaccess
Datei eine Direktive definiert haben.relativDie Ersetzungszeichenfolge wird als Dateisystempfad relativ zum Verzeichnis betrachtet, das die .htaccess
Datei enthält.
R
Wenn Sie in diesem Kontext das Flag ( ) weglassen redirect
(wie in Ihrem ersten Beispiel), wird versucht, die Anforderung intern neu zu schreiben (keine externe Umleitung), sodass sich die sichtbare URL nicht ändert.
Versuchen Sie stattdessen Folgendes oben in Ihrer Stammdatei .htaccess
:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^mode=(list|grid)$
RewriteRule (.*) /$1 [QSD,R=302,L]
Die obigen Angaben ... für alle URLs (.*)
, die eine Abfragezeichenfolge von mode=list
oder mode=grid
(genau) haben, leiten Sie dann zum gleichen URL-Pfad weiter und verwerfen Sie die Abfragezeichenfolge ( QSD
- Query String Discard). Das QSD
ist neu in Apache 2.4 (von dem ich annehme, dass Sie es verwenden). Wenn Sie das QSD
Flag weglassen, erhalten Sie eine Umleitungsschleife (da die Abfragezeichenfolge erneut an die umgeleitete URL angehängt wird).
Beachten Sie, dass das Obige mit der Abfragezeichenfolge übereinstimmtgenau(wie in Ihren Beispielen). Wenn die Abfragezeichenfolge andere URL-Parameter enthält oder die Groß-/Kleinschreibung anders ist, wird keine Übereinstimmung gefunden.
Beachten Sie, dass dies eine 302-Weiterleitung (vorübergehend) ist. Ändern Sie sie erst dann in eine 301-Weiterleitung (permanent), wenn Sie sich vergewissert haben, dass sie einwandfrei funktioniert. 301-Weiterleitungen werden vom Browser dauerhaft zwischengespeichert, was das Testen problematisch machen kann.
Referenz: