2010-02-12 20 views

Respuesta

93
RewriteCond %{QUERY_STRING} book=(\w+)&page=(\d+) 
RewriteRule ^index.php /%1/%2? [L,R=301] 

Debido RewriteRule sólo se ve en el camino (hasta, pero sin incluir el signo de interrogación), utilice RewriteCond para capturar los valores de la cadena de consulta.

Tenga en cuenta que los partidos de RewriteCond son capturados en %1, %2, etc., en lugar de $1, $2, etc.

También tenga en cuenta el ? al final de RewriteRule. Le dice a mod_rewrite que no agregue la cadena de consulta original a la nueva URL, por lo que termina con /DesignPatterns/151 intead de /DesignPatterns/151?book=DesignPatterns&page=151.

Las banderas [L,R=301] hacer dos cosas:

  1. L asegura que no se procesarán otras reglas que de otro modo podrían coincidir (en otras palabras, se asegura que este es el "último" regla de procesado).
  2. R=301 hace que el servidor envíe una respuesta de redirección. En lugar de reescribir, le dice al cliente que intente de nuevo con la nueva URL . El =301 lo convierte en permanent redirect, por lo que, entre otras cosas, los motores de búsqueda sabrán reemplazar la antigua URL con la nueva URL en sus índices.
+10

+1 Me encanta cuando se brinda una explicación completa con una respuesta –

+1

Probablemente también quiera la bandera [L] cuando tenga varias reglas de reescritura. El indicador [L] detiene el procesamiento después de que la regla coincida, y el indicador [R] NO lo incluye implícitamente. – TheJosh

+1

Los $ vs% me estaban matando. No tenía ni idea. ¡Gracias! – keithwyland

Cuestiones relacionadas