2010-10-04 10 views
19

Tengo un recurso que es un . Esto significa mi URL tiene el siguiente aspecto: http://myapp/index/ . Y tengo que añadir los parámetros de consulta para que se vea así: http://myapp/index/.?type=xml utilizo Freemarker para la presentación de mis recursos e hizo un corte por ciento codificación para este caso:Un recurso URL que es un punto (2E%)

<#if key?matches("\\.")> 
<li><a href="${contextPath}/index/%2E">${key}</a></li> 
</#if> 

esto funciona bien para Firefox. Pero todos los demás navegadores como IE, Safari, Chrom, Opera simplemente ignoran mi punto codificado en la url (http://myapp/index/%2E).

¿Alguna sugerencia?

Respuesta

14

en realidad no es muy claramente establecido en la norma (RFC 3986) si una versión codificada por ciento-de . o .. se supone que tiene el mismo significado esta carpeta/arriba-a-carpeta que la versión sin escapar. La Sección 3.3 solo habla sobre "Los segmentos de ruta . y ..", sin aclarar si coinciden con . y .. antes o después de la codificación de PCT.

Personalmente encuentro la interpretación de Firefox que %2E no significa más práctico, pero desafortunadamente todos los otros navegadores no están de acuerdo. Esto significa que no puede tener un componente de ruta que contenga solo . o ...

¡Creo que la única sugerencia posible es "no hagas eso"! Existen otros componentes de ruta que también son problemáticos, normalmente debido a limitaciones del servidor: %2F, %00 y %5C secuencias en las rutas también pueden ser bloqueadas por algunos servidores web, y el segmento de ruta vacío también puede causar problemas. Por lo tanto, en general, no es posible ajustar todas las secuencias de bytes posibles en un componente de ruta.

+0

supongo que tengo para prohibir que entonces, THX. – cuh

+1

He encontrado que incluso si% 2e es parte de una URL, p. 'http: // localhost/index% 2ehtml', Firefox (14) y Chrome lo convierten en' .'. Esto se especifica en la sección 2.3. Más adelante en la sección 3.3, dice que '.' y' ..' son para referencia relativa dentro de la ruta de acceso. Entonces, 'http: // localhost /% 2e' significaría esencialmente' http: // localhost/'. – slowpoison

+1

Buen punto, @slowpoison - "Los URI que difieren en el reemplazo de un carácter no reservado con su correspondiente octeto US-ASCII con codificación porcentual son equivalentes" y "." es un personaje sin reservas Ah bueno. – phyzome

5

No es posible. §2.3 dice que "." es un carácter no reservado y que "los URI que difieren en el reemplazo de un carácter no reservado con su correspondiente octeto US-ASCII codificado en porcentaje son equivalentes". Por lo tanto, /%2E%2E/ es lo mismo que /../, y se normalizará.

(Esta es una combinación de una respuesta por bobince y un comentario de slowpoison.)

Cuestiones relacionadas