Mod_rewrite RewriteRule simples para URLs legados confusos
-
12-11-2019 - |
Pergunta
Lançamento de um novo site para um novo cliente.O site antigo deles tem cerca de 50 produtos e, infelizmente, os nomes dos produtos antigos não correspondem ao novo padrão de URL
Exemplos de URLs antigos:
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
(Os URLs antigos às vezes atingem mais de 150 caracteres.)
Novos URLs:
exemplo.com/products/category/actual-product-name
Não existe um padrão definido e reconhecível para passar do nome do produto antigo para o novo.Existe para a categoria.
Eu tentei redirecionamentos mod_alias simples, mas entendo que preciso de um RewriteRule.Mas estou tendo problemas.Tudo que preciso é de um redirecionamento 1 para 1 para cada um desses 50 URLs.Eu pensei que poderia fazer algo como:
RewriteRule ^/products.aspx?category=Foo&product=ProductName
/products/category/new-product-name/ [R=301,NC]
Mas isso não está funcionando.Eu sei que isso deveria ser simples, mas estou preso.Alguma ideia?
Solução
Use o padrão abaixo para o restante dos seus URLs de redirecionamento.Observe que você escapa de caracteres especiais, por exemplo. ?
, .
e espaço adicionando um
\
na frente deles
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]
Outras dicas
Dê uma olhada no RewriteMap
diretiva de mod_rewrite
.
Você pode especificar em um arquivo de texto algo como:
products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name
E no seu httpd.conf
RewriteMap productmap /path/to/map/file.txt
RewriteRule ^(.*) ${productmap:$1} [R=301,NC]
Dica:Se você deseja um redirecionamento permanente, certifique-se de definir um redirecionamento apropriado Cache-Control
e Expires
cabeçalho para instruir os navegadores a armazenar em cache o 301.
Você pode tentar algo assim:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$
RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
Notas:
No contexto por diretório (.htaccess), o prefixo por diretório é removido, portanto você não pode iniciar o
RewriteRule
padrão com^/
.Você tem que usar
RewriteCond
para corresponder à string de consulta.Como afirmado em outra resposta, um
RewriteMap
A solução pode ser adequada para esta situação, se você tiver acesso a httpd.conf/a definição de vhost para este site.Não tenho certeza de como isso funciona com strings de consulta.Para algo assim, pode ser uma solução melhor reescrever todos esses URLs em um script do lado do servidor e usar o script para fazer o redirecionamento HTTP para cada URL.