web-dev-qa-db-fra.com

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 simplement empêcher quiconque d'accéder à une page avec? Page = 1 à la fin de l'URL, et plutôt les diriger vers la même URL moins ?page=1.

Existe-t-il un moyen rapide de procéder?

28
Freddy

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 de remplacer le chemin complet (. *) Par lui-même ($ 1), mais de rendre la chaîne de requête vide (?), Et de faire du résultat une redirection permanente (301).

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

42
Fabian Fagerholm

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

21
Didier Sampaolo

Si vous êtes sur Apache 2.4 Vous pouvez simplement utiliser le QSD (indicateur Query String Discard) 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 d'accès:

 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 renverra 500 erreurs sur les versions Apache ci-dessous 2.4 car elles ne prennent pas en charge 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 t'aides!)

8
starkeen

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

RewriteRule ^(.*) http://domain.com/$1? [R=301,L]
4
Krzysztof Przygoda