2010-08-11 32 views
24

estoy tratando de hacer el siguiente cambio de dirección (301) usando .htaccessmod_rewrite: eliminar la cadena de consulta de la URL?

*? Page = 1 redirige a *

(donde * es un comodín).

Básicamente, solo quiero evitar que alguien acceda a una página con? Page = 1 al final de la URL, y en su lugar dirigirlos a la misma URL menos ?page=1.

¿Hay una manera rápida de hacer esto?

+0

buena pregunta: D – ncomputers

Respuesta

38

Esto debe hacerlo:

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

Línea por línea:

  1. que enciende la funcionalidad de reescritura.
  2. Especifique como condición ("instrucción if") que la cadena de consulta debe ser exactamente page=1 para que se apliquen las siguientes reglas.
  3. Luego especifica una regla que dice que sustituye la ruta completa (. *) Consigo misma ($ 1), pero hace que la cadena de consulta esté vacía (?) Y hace que el resultado sea una redirección permanente (301).

Si desea que el redireccionamiento sea temporal (302), puede eliminar la parte =permanent. Movido temporalmente es el predeterminado para el indicador R.

+0

Gracias por su respuesta! Parece que no funciona, sin embargo, no parece tener ningún efecto cuando intento acceder a .../?page=1 alguna idea. – Freddy

+0

Compruebe que su servidor tenga mod_rewrite cargado, y que la configuración de su servidor le permita especificar esas configuraciones de reescritura en un archivo .htaccess. –

+0

@Fabian - La 'RewriteRule' no coincidirá porque la entrada al patrón de prueba en un contexto por directorio (' .htaccess') no contendrá una barra diagonal. Sospecho que ese es el problema aquí. –

13

También puede utilizar el indicador QSD (Query String Discard) para redirigir a algún lugar sin pasar la cadena de consulta.

+8

QSD está disponible en Apache versión 2.4.0 y posterior: http://httpd.apache.org/docs/trunk/rewrite/flags.html#flag_qsd – waraker

3

para pelar toda la cadena de consulta esto será suficiente:

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

buena respuesta: D creo que también puede ser '' RewriteRule^$ {REQUEST_URI}? '' – ncomputers

6

Si usted está en Apache 2.4 puede simplemente usar el DEQ (bandera de cadena de consulta Descartar) para desechar las cadenas de consulta específicos de la URL de destino.

Aquí se muestra un ejemplo para Apache 2.4 usuarios:

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

nueva url: -/foo/bar/

código .htaccess:

RewriteEngine on 

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

la regla anterior se redirigirá cualquier URI con ? Page = 1 para eliminar las cadenas de consulta. Este ejemplo arrojará 500 errores en las versiones de Apache por debajo de 2.4 ya que no son compatibles con QSD.

En las versiones inferiores de Apache, puede usar un signo de interrogación vacío ? al final de la url de destino para eliminar las cadenas de consulta.

Un ejemplo:

RewriteEngine on 

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

El ejemplo anterior funciona casi en todas las versiones de Apache.

(Espero que esto ayude!)

Cuestiones relacionadas