htaccess leitet alle URLs mit Fragezeichen-Parameter um auf ohne

htaccess leitet alle URLs mit Fragezeichen-Parameter um auf ohne

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 RewriteRuleDirektive akzeptiert bis zu 3 Argumente:

RewriteRule pattern substitution [flags]

DerMuster(erstes Argument) der RewriteRuleDirektive 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 RewriteRuleDirektive nicht abgleichen.

Um die Abfragezeichenfolge abzugleichen, müssen Sie eine zusätzliche RewriteCond(Bedingungs-)Direktive verwenden und anhand der QUERY_STRINGServervariable prüfen. RewriteCondDirektiven geltenBedingungender RewriteRulefolgenden Richtlinie.

Allerdings (.*)$^mode=listwird 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 $1Rü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 RewriteBasean anderer Stelle in Ihrer .htaccessDatei eine Direktive definiert haben.relativDie Ersetzungszeichenfolge wird als Dateisystempfad relativ zum Verzeichnis betrachtet, das die .htaccessDatei enthält.

RWenn 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=listoder mode=grid(genau) haben, leiten Sie dann zum gleichen URL-Pfad weiter und verwerfen Sie die Abfragezeichenfolge ( QSD- Query String Discard). Das QSDist neu in Apache 2.4 (von dem ich annehme, dass Sie es verwenden). Wenn Sie das QSDFlag 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:

verwandte Informationen