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?

Foi útil?

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:

  1. No contexto por diretório (.htaccess), o prefixo por diretório é removido, portanto você não pode iniciar o RewriteRule padrão com ^/.

  2. Você tem que usar RewriteCond para corresponder à string de consulta.

  3. 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.

  4. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top