Apache2: Problemas que combinam caracteres acentuados na string de consulta usando RewriteCond & RewriteRule

2

Trabalhar em um site no qual o plano é mover URLs de um formato de string de consulta para um formato baseado em número. Existem muitas URLs com acentos & caracteres UTF8 semelhantes neles. O problema? Não consigo fazer com que o Apache2 corresponda corretamente a caracteres acentuados & faça uma reescrita. Eu estou fazendo isso tudo na configuração do Apache2.

Por exemplo, este URL:

http://great.website.example.com/?place=cafe

Funcionará como esperado com essa configuração do Apache2 RewriteRule:

  RewriteCond %{QUERY_STRING} ^(place|location)=cafe
  RewriteRule ^/find/$ /find/1234? [L,R=301]

Agora olhe para este URL. Observe o acentuado é :

http://great.website.example.com/?place=café

Por que esse URL não funciona com a seguinte configuração do Apache2 RewriteRule:

  RewriteCond %{QUERY_STRING} ^(place|location)=café
  RewriteRule ^/find/$ /find/1234? [L,R=301]

Ambas as regras devem reescrever o URL para o seguinte:

http://great.website.example.com/find/1234

Mas o exemplo com o acentuado é simplesmente não funciona. Talvez um caractere curinga funcione, mas parece que não consigo fazer isso funcionar.

    
por JakeGould 26.03.2013 / 18:15

3 respostas

1

Você pode usar um RewriteMap para fazer o escape sem escape para você. assim:

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

Na segunda linha de RewriteCond eu uso% 2, pois% 1 conteria "location" ou "place".

No entanto, adicionar um monte de RewriteRules à sua configuração para mapear palavras para números será um grande impacto no seu servidor, e será difícil de manter. Uma solução melhor é usar um RewriteMap para isso também.

Por exemplo, asume que /etc/apache2/places.txt contém:

café    1234
shop   1235
...

Então, isso deve funcionar para você:

RewriteMap unescape int:unescape
RewriteMap places   txt:/etc/apache2/places.txt

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   (.*)
RewriteRule ^/find/$         /find/${places:%1}? [L,R]

Você também pode usar um RewriteMap baseado em uma consulta de banco de dados. Essa seria a minha escolha preferida, pois eu poderia fazer o trabalho de combinar palavras com números para o sistema de gerenciamento de conteúdo.

Mais detalhes você pode encontrar na documentação: link

    
por 27.03.2013 / 11:44
1

Seu /?place=café será codificado em URL pelo navegador para /?place=caf%C3%A9 e é isso que você deve corresponder.

    
por 26.03.2013 / 19:39
0

Em um , alguém sugeriu usar RewriteMap para chamar um programa externo para reescrever URLs.

Além disso: Talvez o pedido seja algo totalmente diferente? Um navegador pode ter traduzido internamente os caracteres acentuados para ASCII com codificação de URL? Por exemplo. ' %20 ' em vez de ' '.

    
por 26.03.2013 / 19:33