¿Cómo puedo asociar las variables de cadena de consulta con mod_rewrite?

Supongamos que tengo URL con parámetros de cadena de consulta como estos:

/index.php?book=DesignPatterns&page=139 /index.php?book=Refactoring&page=285 

Usando mod_rewrite , ¿cómo puedo redirigirlos a las URL de SES como estas?

 /DesignPatterns/139 /Refactoring/285 

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

Debido a que RewriteRule solo mira la ruta (hasta, pero sin incluir, el signo de interrogación), use RewriteCond para capturar los valores en la cadena de consulta.

Tenga en cuenta que las coincidencias de RewriteCond se capturan 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 .

Los indicadores [L,R=301] hacen dos cosas:

  1. L asegura que no se procesarán otras reglas que de lo contrario coincidirían (en otras palabras, asegura que esta es la “última” regla procesada).
  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. The =301 convierte en un redireccionamiento permanente , de modo que, entre otras cosas, los motores de búsqueda sabrán reemplazar la antigua URL con la nueva URL en sus índices.

Si la situación fuera inversa a la pregunta original, sería: RewriteCond% {QUERY_STRING} (\ w +) RewriteRule ^ index.php? Book =% 1? [L, R = 301]

cambie esto / DesignPatterns / 139 en este /index.php?book=DesignPatterns&page=139