Apache mod_rewrite codifica doble cadena de consulta en la redirección

13

Hemos encontrado un problema extraño (¿un error, tal vez?) Con el comportamiento de Apache mod_rewrite al pasar por las cadenas de consulta.

Para reproducir, hemos configurado una instalación limpia de Ubuntu (oneiric) con la configuración predeterminada de Apache. Hemos habilitado mod_rewrite, y en la configuración predeterminada del sitio, hemos agregado lo siguiente:

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

Para probar, usamos curl:

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

El resultado relevante es:

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

Como puede ver, la cadena de consulta tiene doble escape, lo cual es incorrecto. ¿Alguien tiene alguna idea de cómo podemos solucionar esto? Un par de cosas que hemos probado:

  • Añadiendo [NE]. Esto nos da la cadena de consulta correcta, pero la ruta no se escapa, lo que conduce a nuevos problemas.
  • Agregando [NE, B]. Esto parece funcionar, pero hace que se /escapen las partes entre ay bde la ruta.
  • Desescapar la cadena de consulta manualmente.

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

    Sin embargo, esto significa que no podemos distinguir entre, digamos, an &y escapado &en la cadena de consulta.

Actualizar:

Este informe de error describe el mismo problema. El primer comentario vincula a una confirmación que aparentemente soluciona el problema, pero como Pieter dice a continuación, no parece que se haya solucionado.

Erik Hesselink
fuente

Respuestas:

7

Esto parece ser un error en Apache. Este informe de error es un poco desordenado, pero describe su problema exactamente:

https://issues.apache.org/bugzilla/show_bug.cgi?id=34602

Parece que están al tanto del problema. Aunque el error afirma que se han solucionado, he probado esto con Apache 2.3.15, y el problema todavía parece estar allí. También tenga en cuenta que Apache 2.3 es una versión beta, por lo que no le sirve de nada, incluso si lo solucionó, hasta que Apache 2.4 esté fuera.

Pieter
fuente
Parece que Apache 2.4.10 todavía está haciendo esto, aunque debería haberse solucionado en 2.4.1 .
Arjan
1
Todavía veo el problema en 2.4.7
François