2010-08-11 7 views
24

Je suis en train de faire de la redirection suivante (301) en utilisant .htaccessmod_rewrite: supprimer la chaîne de requête de l'URL?

*? 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 le même URL moins ?page=1.

Existe-t-il un moyen rapide de le faire?

+0

bonne question: D – ncomputers

Répondre

38

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 ("if statement") que la chaîne de requête doit être exactement page=1 pour les règles suivantes à appliquer.
  3. Ensuite, vous spécifiez une règle qui dit remplacer le chemin entier (. *) Par lui-même ($ 1), mais rendre la chaîne de requête vide (?) Et rendre le résultat une redirection permanente (301).

Si vous souhaitez que la redirection soit temporaire (302), vous pouvez simplement supprimer la pièce =permanent. Moved Temporarily est la valeur par défaut du drapeau R.

+0

Merci pour votre réponse! Je n'arrive pas à faire fonctionner ça mais ça ne semble pas avoir d'effet quand j'essaie d'accéder à des idées ../?page=1? – Freddy

+0

Vérifiez que votre serveur est équipé de mod_rewrite et que les paramètres de votre serveur vous permettent de spécifier ces paramètres de réécriture dans un fichier .htaccess. –

+0

@Fabian - Le 'RewriteRule' ne correspondra pas car l'entrée dans le modèle de test dans un contexte par répertoire (' .htaccess') ne contiendra pas de barre oblique. Je pense que c'est le problème ici. –

13

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

+8

QSD est disponible dans la version 2.4.0 d'Apache et plus tard: http://httpd.apache.org/docs/trunk/rewrite/flags.html#flag_qsd – waraker

3

Pour dénuder toute la chaîne de requête ce sera suffisant:

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

bonne réponse: D je crois qu'il peut également être '' RewriteRule^$ {REQUEST_URI}? '' – ncomputers

6

Si vous êtes sur Apache 2.4 Vous pouvez simplement utiliser le QSD (chaîne de requête Jeter drapeau) pour rejeter les chaînes de requête spécifiques de votre URL de destination.

Voici un exemple pour Apache 2.4 utilisateurs:

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 toute uri avec ? Page = 1 pour supprimer les chaînes de requête. Cet exemple retournera 500 erreurs sur les versions d'Apache ci-dessous 2.4 car elles 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 de apache.

(Hope this helps!)

Questions connexes