Apache mod_rewrite double codifica string de consulta no redirecionamento

12

Encontramos um problema estranho (um bug, talvez?) com o comportamento do mod_rewrite do Apache ao passar por strings de consulta.

Para reproduzir, instalamos uma instalação limpa do Ubuntu (onírico) com a configuração padrão do Apache. Nós habilitamos o mod_rewrite, e na configuração do site padrão, adicionamos o seguinte:

RewriteEngine on
RewriteRule ^/(.*)$ /r/$1 [R]

Para testar, usamos o curl:

curl -I 'http://[ubuntu-machine]/a/b%20c?a%20b'

A saída relevante é:

HTTP/1.1 302 Found
Server: Apache/2.2.20 (Ubuntu)
Location: http://[ubuntu-machine]/r/a/b%20c?a%2520b

Como você pode ver, a string de consulta tem escape duplo, o que está errado. Alguém tem alguma ideia de como poderíamos consertar isso? Algumas coisas que tentamos:

  • Adicionando [NE]. Isso nos dá a string de consulta correta, mas o caminho não é removido, o que leva a novos problemas.
  • Adicionando [NE, B]. Isso parece funcionar, mas faz com que o / entre as partes a e b do caminho seja escapado.
  • Descontinuando a string de consulta manualmente.

    RewriteCond %{QUERY_STRING} .*
    RewriteMap unescape int:unescape  
    RewriteRule ^(.*)$          $1?${unescape:%{QUERY_STRING}}
    

    No entanto, isso significa que não podemos distinguir entre, digamos, um & e um escape & na string de consulta.

Atualização:

Este relatório de erros descreve o mesmo problema. O primeiro comentário vincula a um commit aparentemente consertando o problema, mas como Pieter diz abaixo, ele não parece estar realmente consertado.

    
por Erik Hesselink 17.11.2011 / 12:20

1 resposta

7

Isso parece ser um bug no Apache. Este relatório de bug é um pouco confuso, mas descreve exatamente o seu problema:

link

Parece que eles estão cientes do problema. Embora o bug afirme que eles foram corrigidos, eu testei isso com o Apache 2.3.15, e o problema ainda parece estar lá. Observe também que o Apache 2.3 é uma versão beta, então não adianta você, mesmo que tenha consertado, até que o Apache 2.4 esteja fora.

    
por 18.11.2011 / 11:56