Reescreva a regra quando a origem contiver um '?'

Reescreva a regra quando a origem contiver um '?'

Coçando minha cabeça com isso. Eu tenho um URL antigo:

     http://myserver/blog/archive?openview&type=Category&key=Demo

e um novo URL

     http://myserver/blog/categories/Demo

Estou tentando obter uma regra de reescrita para isso. Eu pensei que seria:

     ^/blog/archive\?openview&type=Category&key=(.*) /blog/categories/$1.html [NC,R=301,L]

Mas isso não faz nada. Tentei o URL e a regra (substitua ? por /):

     http://myserver/blog/archive/openview&type=Category&key=Demo
     ^/blog/archive/openview&type=Category&key=(.*) /blog/categories/$1.html [NC,R=301,L]

E isso funciona como esperado. Então, estou um pouco confuso sobre como lidar com o? para correspondência no URL antigo. Todas as amostras que encontrei descrevem o caso oposto. Enviando o URL "bonito" para o feio. No meu caso, o URL "feio" é o que as pessoas marcaram no passado e quero ter certeza de que eles acessarão os novos dados corretamente

Responder1

Pensando um pouco (e lendoa documentação) mais tarde:

As correspondências mod_rewrite usam apenas a parte de localização do URL. O "?" marca o final do local e o início dos parâmetros (também conhecido como QueryString). Depois que percebi isso, foi apenasum Google de distância.

Então, para transformar corretamente você precisa de uma condição de reescrita:

RewriteCond %{QUERY_STRING}     ^openview&type=Category&key=(.*)    [NC]
RewriteRule ^/blog/archive$ /blog/categories/%1.html [NC,R=301,L]

Funciona como um encanto

informação relacionada