Mod_rewrite y múltiples variables en diferente orden

Soy nuevo en StackOverflow, así que haré todo lo posible para ser lo más claro posible. Estoy reescribiendo mis URL para que sean más compatibles con SEO, así que investigué mod_rewrite y pensé que podría ser la mejor manera de hacerlo. Estoy trabajando en un sitio web de comercio electrónico (ese detalle tiene su importancia más adelante). Entonces, cuando se trata de páginas simples como /about_us.php, es bastante fácil redirigir .

RewriteEngine on 
RewriteBase /

RewriteRule ^about-us/$ /about_us.php

Creo que todos estamos de acuerdo en esto. El problema surge cuando trato de reescribir la URL en mi página de filtro. Así que en una página como

example.com/examplefile.php?filter1=a&filterb=2&filterc=3

Todavía es fácil redirigir. (NB: elegí escribir "filtro1" antes del valor)

RewriteRule ^/products/filter1-([-a-zA-Z0-9]+)/filter2-([-a-zA-Z0-9]+)/filter3-([-a-zA-Z0-9]+)/$ /examplefile.php?filter1=$1&filterb=$2&filterc=$3 

Aquí está la parte con la que me tropiezo: es posible que los filtros estén en un orden diferente, digamos

example.com/examplefile.php?filterb=2&filter1=a&filterc=3

De ninguna manera voy a escribir todas las posibilidades en .htaccess, ya que tengo 6 filtros diferentes, y que puedes usar de 1,2,3... a 6 filtros, ordenados o no, son... muchas posibilidades (te dejaré hacer los cálculos ;) ).

¿Tiene alguna solución con mod_rewrite, o tal vez con algo más? Estoy pensando en la redirección 301, pero mi preocupación es cómo van a aparecer los enlaces en los motores de búsqueda. Me estoy poniendo las manos en el SEO, pero algunas partes todavía son un misterio para mí (¡supongo que eso es lo que quiere el asistente de Google! )

preguntado el 27 de julio de 12 a las 14:07

1 Respuestas

Desde el punto de vista de SEO, no debe tener varias URL con el mismo contenido, por lo que no debe crear enlaces como /filter1-42/filter2-42/ y /filter2-42/filter1-42/ en el sitio si dan los mismos resultados (URL canónica etiqueta de enlace podría ayudar con fuentes externas que vinculan a su sitio).

editar: eliminó 'filtro' de los patrones, para hacerlo más generalizado.

Partiría el problema por la mitad y lo siguiente RewriteRule:

RewriteRule ^/products/((?:[a-zA-Z0-9]+-[-a-zA-Z0-9]+/?)*) /products.php?filterstr=$1

y manejar el filterstr analizando en php así:

$filters = array();
$filterparts = explode('/', trim(isset($_GET['filterstr']) ? $_GET['filterstr'] : '', '/'));
foreach ($filterparts as $filter) {
    if (preg_match('/(?<key>\w+)-(?<value>[-a-z0-9]+)/i', $filter, $m)) {
        $filters[$m['key']] = $m['value'];
    }
}

Esto debería hacer esta url:

http://example.com/products/language-france-and-stuff/filtera-42/filter1-42/filterb-42/

salida:

array(4) { 'language' => string(6) "france" 'filtera' => string(2) "42" 'filter1' => string(2) "42" 'filterb' => string(2) "42" }  

La idea es que cada segmento de URL después del primero sea un /<name>-<value>/ par donde un <name> no puede incluir un - y /, y la <value> no puede incluir un /

Copiar ese patrón en cada lugar que lo necesite crearía un infierno de mantenimiento si lo necesita, digamos 10 lugares, por lo que en este punto intentaría introducir alguna estructura para el manejo completo de parámetros y crear un controlador frontal, eso analizaría todo $_SERVER['REQUEST_URI'] y seleccione el controlador y pase los parámetros de alguna manera estándar, por lo que solo necesita uno RewriteRule en tu .htaccess, y todo lo demás depende de la aplicación (para una bonificación adicional, es más fácil depurar allí).

Respondido 28 Jul 12, 19:07

sí, eso es lo que pensé... probaré tu solución y te mantendré actualizado. ¡Gracias! - user1557845

Otra pregunta, con su método, ¿sería posible vincular mi base de datos a la URL, es decir, si tengo (por ejemplo) país = 5 pero quiero mostrar / país-francia - user1557845

editar: tiene un error tipográfico en su línea 2 $filterparts = explotar('/', trim(isset($_GET['filterstr']) ? $_GET['filterstr'] : '')); - user1557845

Se corrigió el error tipográfico y se generalizó más la solución con una nota al pie adicional de los controladores frontales. - complejo857

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.