mod rewrite: supprimer la chaîne de requête de L'URL?

J'essaie de faire la redirection suivante (301) en utilisant .htaccess

*?page=1 redirige vers *

(Où * est un caractère générique).

Fondamentalement, je veux juste empêcher quiconque d'accéder à une page avec ?page = 1 à la fin de L'URL, et à la place les diriger vers la même url moins ?page=1.

Y a-t-il un moyen rapide de le faire?

26
demandé sur Philip Pittle 2010-08-11 13:26:42

4 réponses

Cela devrait le faire:

RewriteEngine    On
RewriteCond      %{QUERY_STRING}    ^page=1$
RewriteRule      (.*)               $1?     [R=permanent]

, ligne par Ligne:

  1. vous activez la fonctionnalité de réécriture.
  2. vous spécifiez comme condition ("instruction if") que la chaîne de requête doit être exactement page=1 pour que les règles suivantes s'appliquent.
  3. Ensuite, vous spécifiez une règle qui dit remplacer le chemin entier (.* ) avec lui-même ($1), mais rendre la chaîne de requête vide (?), et faire du résultat une redirection permanente (301).

Si vous voulez que la redirection soit temporaire (302) ensuite, vous pouvez simplement supprimer la partie =permanent. Déplacé temporairement est la valeur par défaut pour l'indicateur R.

40
répondu Fabian Fagerholm 2010-08-11 12:49:28

Vous pouvez également utiliser L'indicateur QSD (query String Discard) pour rediriger quelque part sans passer la chaîne de requête.

19
répondu Didier Sampaolo 2014-04-01 14:20:11

Si vous utilisez Apache 2.4, Vous pouvez simplement utiliser QSD (query String Discard flag) pour supprimer les chaînes de requête spécifiques de votre url de destination.

Voici un exemple pour les utilisateurs D'Apache 2.4:

Ancienne url : - /foo/bar/?page = 1

Nouvelle url : - /foo/bar/

Code Htaccess:

 RewriteEngine on

 RewriteCond %{THE_REQUEST} \?page=1\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI} [L,R,QSD]

La règle ci-dessus redirigera tout uri avec ?page=1 pour supprimer les chaînes de requête. Cet exemple retournera 500 erreur sur les versions Apache ci dessous 2.4 comme ils ne supportent pas QSD.

Sur les versions inférieures D'Apache, vous pouvez utiliser un point d'interrogation vide ? à la fin de l'url de destination pour supprimer les chaînes de requête.

Un exemple:

 RewriteEngine on

 RewriteCond %{THE_REQUEST} \?page=1\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI}? [L,R]

L'exemple ci-dessus fonctionne presque sur toutes les versions d'apache.

(J'espère que cela aide!)

7
répondu starkeen 2016-03-21 04:47:05

Pour supprimer toute la chaîne de requête, cela suffira:

RewriteRule ^(.*) http://domain.com/$1? [R=301,L]
3
répondu Krzysztof Przygoda 2014-11-13 20:04:16