web-dev-qa-db-fra.com

Mod_rewrite delete paramètre dans 301 Redirect

Comment ferais-je pour réécrire:

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

à:

http://www.example.com

Je souhaite supprimer toutes les instances sur aff=x, quel que soit le nombre d'autres paramètres de l'URL.

2
Daimko

Je souhaite supprimer toutes les instances sur aff=x, quel que soit le nombre d'autres paramètres de l'URL.

En supposant que vous souhaitiez conserver tous les autres paramètres d'URL (dans n'importe quel ordre) et simplement supprimer le paramètre aff=number, vous pouvez alors procéder comme suit en utilisant mod_rewrite dans le fichier racine .htaccess:

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

Cela devra aller avant les directives WordPress existantes.

Cela suppose que si le paramètre aff est présent, sa valeur ne sera que de chiffres et d'au moins 1 chiffre.

Le $1 est une référence arrière de la RewriteRulepattern capturée. Ainsi, cela gérera tout chemin d’URL, pas seulement la racine du document, comme dans votre exemple.

%1 et %2 sont des références arrières des groupes capturés dans le précédent CondPattern. %1 est before le paramètre à supprimer et %2 est après. Les deux sont facultatifs.

Modifiez la redirection 302 (temporaire) en 301 (permanent) uniquement après avoir confirmé que tout fonctionne correctement (si cela est destiné à être permanent).


UPDATE # 1: La chaîne de requête contient des caractères codés en%

Si l'un des autres paramètres d'URL (que vous souhaitez conserver) contient des valeurs codées en URL (codées en%), vous devez ajouter l'indicateur NE (noescape) à la directive RewriteRule pour empêcher que ces caractères ne soient codés deux fois substitution. Par exemple:

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

La variable de serveur QUERY_STRING n'est pas codée en% par Apache. Normalement, mod_rewrite URL code la substitution avant de renvoyer la réponse au client. Mais cela codera doublement tous les caractères déjà encodés que nous avons capturés à partir de la chaîne de requête. L'indicateur NE empêche cela.


(UPDATE # 2:} _ La valeur du paramètre d'URL à supprimer peut être n'importe quoi

La question portait spécifiquement sur la suppression d'un paramètre d'URL appelé aff qui contenait un "nombre". En règle générale, vous devez être aussi spécifique que possible lorsque vous utilisez regex. Toutefois, si le paramètre d'URL à supprimer peut contenir rien, modifiez le CondPattern pour qu'il ressemble à l'un des éléments suivants.

  • ^(.*&|)aff=.*?(?:&(.*)|)$ - une correspondance non gourmande de 0 caractère ou plus.
  • ^(.*&|)aff=[^&]*(?:&(.*)|)$ - correspond à tout sauf au & (délimiteur de paramètre d'URL) 0 fois ou plus.

Le point important dans ces deux expressions rationnelles est que la valeur mise en correspondance n'est pas capturé, c'est-à-dire. ne doit pas être entouré de parenthèses simples.

En résumé:

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