it-swarm.com.de

Mod_rewrite Löschparameter in 301 Redirect

Wie würde ich umschreiben:

http://www.example.com/?aff=number

zu:

http://www.example.com

Ich möchte alle Instanzen auf aff=x entfernen, unabhängig von der Anzahl der anderen Parameter in der URL.

2
Daimko

Ich möchte alle Instanzen auf aff=x entfernen, unabhängig von der Anzahl der anderen Parameter in der URL.

Angenommen, Sie möchten keep andere URL-Parameter (in beliebiger Reihenfolge) und einfach den Parameter aff=number entfernen, dann können Sie mit mod_rewrite in der Stammdatei .htaccess Folgendes tun:

RewriteCond %{QUERY_STRING} ^(.*&|)aff=\d+(?:&(.*)|)$
RewriteRule (.*) /$1?%1%2 [R=302,L]

Dies muss nach vor den vorhandenen WordPress-Anweisungen erfolgen.

Dies setzt voraus, dass der Parameter aff nur Ziffern und mindestens eine Ziffer enthält.

Der $1 ist ein Rückverweis auf die erfasste RewriteRule pattern . Dies behandelt also jeden URL-Pfad, nicht nur den Dokumentenstamm, wie in Ihrem Beispiel.

%1 und %2 sind Rückverweise auf die erfassten Gruppen im vorherigen CondPattern . %1 ist before der zu entfernende Parameter und %2 ist after. Beides ist optional.

Ändern Sie die (temporäre) Weiterleitung von 302 in 301 (permanent) erst, nachdem Sie bestätigt haben, dass dies in Ordnung ist (wenn dies dauerhaft sein soll).


UPDATE # 1: Abfragezeichenfolge enthält% -codierte Zeichen

Wenn einer der anderen URL-Parameter (die Sie beibehalten möchten) URL-codierte (% -codierte) Werte enthält, müssen Sie der Anweisung NE (noescape) das Flag RewriteRule hinzufügen, um zu verhindern, dass diese Zeichen in der Anweisung doppelt codiert werden Substitution . Zum Beispiel:

RewriteRule (.*) /$1?%1%2 [NE,R=302,L]

Die Servervariable QUERY_STRING wird von Apache nicht% -decodiert. Normalerweise codiert mod_rewrite die URL substitution , bevor die Antwort an den Client zurückgesendet wird. Dadurch werden jedoch alle bereits codierten Zeichen, die wir aus der Abfragezeichenfolge erfasst haben, doppelt codiert. Das Flag NE verhindert dies.


UPDATE # 2: Zu entfernender URL-Parameterwert könnte sein alles

Die Frage befasste sich speziell mit dem Entfernen eines URL-Parameters namens aff, der eine "Zahl" enthielt. Im Allgemeinen sollten Sie beim Umgang mit Regex so genau wie möglich vorgehen. Wenn der zu entfernende URL-Parameter jedoch any enthalten kann, ändern Sie das CondPattern so, dass es eine der folgenden Bedeutungen hat

  • ^(.*&|)aff=.*?(?:&(.*)|)$ - eine nicht gierige Übereinstimmung von 0 oder mehr Zeichen.
  • ^(.*&|)aff=[^&]*(?:&(.*)|)$ - stimmt mit nichts außer & (URL-Parameter-Begrenzer) 0 oder mehrmals überein.

Der wichtige Punkt in diesen beiden Regexen ist, dass der Wert , der abgeglichen wird, nicht erfasst ist, dh. Darf nicht in einfache Klammern eingeschlossen werden.

In Summe:

RewriteCond %{QUERY_STRING} ^(.*&|)aff=[^&]*(?:&(.*)|)$
RewriteRule (.*) /$1?%1%2 [NE,R=302,L]
1
MrWhite