2011-09-25 12 views
6

Tengo un conjunto de reglas de reescritura (en un .htaccess) algo como esto:no pueden igualar% 2F en mod_rewrite

RewriteRule ^list/vendor/(.*)$ list.php?vendor=$1 
RewriteRule ^list/product/(.*)$ list.php?product=$1 
RewriteRule ^list/(.*)$ list.php?search=$1 

(no creo que los dos primeros son relevantes a mi pregunta, sin embargo) .

cuando escribo en myserver.com/list/foo%2Cbar o incluso myserver.com/list/foo/bar, consigo los resultados que cabe esperar: list.php se llama con foo,bar y foo/bar en $_GET['search'].

Pero si escribo myserver.com/list/foo%2Fbar, ¡parece que la regla no coincide! Me da un error 404 en su lugar. ¿Qué puede estar pasando aquí? Apache 2.2.14, si es importante.

(Intenté en Firefox y Chrome, los mismos resultados, pero podría ser el navegador que funciona, por supuesto).

+0

¿Podría ser que Apache ni siquiera mire en mi archivo .htaccess en este caso? Eso sería un error, supongo ... – LHMathies

+0

El registro de errores contiene (en el nivel de información): 'found% 2f (codificado '/') en URI ... devolviendo 404' – cweiske

Respuesta

14

Bah, lo encontré ... Apache opción AllowEncodedSlashes, que no se puede establecer por directorio o desde .htaccess, y que está desactivado por defecto.

Genere un tiempo de solución, si no puedo conseguir que los anfitriones lo activen en mi servidor virtual.

+0

Cuando no quiere o es imposible cambiarlo la configuración del servidor puede reemplazar todos los caracteres '/' por '-' antes de crear la URL. Esto no se codificará como un carácter '% xx'. Cuando necesite la cadena original simplemente reemplace '-' con'/'nuevamente. – LEDfan

+0

Acabo de encontrar exactamente el mismo problema al intentar pasar una URL como parámetro en una URL mod_rewrite. Mi solución fue duplicar urlencode la URL que estoy tratando de pasar, luego en el extremo receptor lo decodifico. Estoy usando JavaScript y PHP, así que en el extremo de JavaScript utilizo 'encodeURIComponent (encodeURIComponent (urlToBePassed))' para que lo que realmente se pase como parámetro sea 'http://example.com/url/http%253A%252F% 252Ftheurl.being.passed.com% 252FsomeDir% 252FsomeImage.png'. Un poco intrincado pero parece funcionar. –