Simple mod_rewrite RewriteRule para confuso legado de la dirección url
-
12-11-2019 - |
Pregunta
El lanzamiento de un nuevo sitio web para un cliente nuevo.Su antiguo sitio tiene alrededor de 50 productos y, por desgracia, los viejos nombres de productos que no coinciden con el nuevo patrón de URL
Viejo Ejemplos de URL:
example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription
example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123
example.com/products.aspx?category=Bar&product=ProductCategoryProdNameRandomNumbers
(La antigua URL a veces golpear a más de 150 caracteres).
La nueva URL es:
example.com/products/category/actual-product-name
No hay, patrón reconocible para ir desde el antiguo nombre de producto para el nuevo.No es para la categoría.
He intentado simple mod_alias Redirecciones, pero entiendo que necesito un RewriteRule en su lugar.Pero estoy teniendo problemas.Todo lo que necesito es un 1-a-1 redirect para cada uno de estos 50 de la URL.Pensé que podría hacer algo como:
RewriteRule ^/products.aspx?category=Foo&product=ProductName
/products/category/new-product-name/ [R=301,NC]
Pero que no está funcionando.Sé que esto debe ser simple, pero estoy atascado.Alguna idea?
Solución
Utilice el siguiente patrón para el resto de su url de redireccionamiento.Tenga en cuenta que usted escapar caracteres especiales, por ejemplo, ?
, .
y el espacio mediante la adición de un
\
en frente de ellos
RewriteEngine on
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /products\.aspx\?category=Foo&product=SuperLongNoBreakProductNameIDDescription [NC]
RewriteRule ^ /products/category/new-product-name/ [R=301,NC]
Otros consejos
Eche un vistazo a la RewriteMap
la directiva de mod_rewrite
.
Usted puede especificar en un archivo de texto algo como:
products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name
Y en su httpd.conf
RewriteMap productmap /path/to/map/file.txt
RewriteRule ^(.*) ${productmap:$1} [R=301,NC]
Sugerencia:Si se trata de una redirección permanente que desea, asegúrese de establecer la adecuada Cache-Control
y Expires
encabezado para instruir a los navegadores caché de la 301.
Usted puede intentar algo como esto:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$
RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
Notas:
En per-dir (.htaccess) contexto, el per-dir prefijo es despojado, por lo que no se puede iniciar el
RewriteRule
patrón con^/
.Usted tiene que usar
RewriteCond
para el partido contra la cadena de consulta.Como se dijo en otra respuesta, una
RewriteMap
la solución podría ser adecuado para esta situación, si usted tiene acceso a httpd.conf / el vhost definición para este sitio.No estoy seguro de cómo funciona con cadenas de consulta, aunque.Para algo como esto, que podría ser una mejor solución para volver a escribir todas estas direcciones Url a un script del lado servidor, y utilizar el script para hacer la redirección HTTP para cada URL.