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 entrea
yb
de 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.
fuente