2010-02-09 30 views
7

resuelto: trabaja¿Cómo puedo pasar "/" a través de GET en URI?

Este URI:

/controller/action?ret=%2F 

Quiero pasar un parámetro "/" adicional a la acción del controlador. Así que hice esto:

$par1 = urlencode('/'); 
$this->_redirect('/controller/action/par1/' . $par1); 

Pero consigo este mensaje de error:

Not Found 

The requested URL /controller/action/ret// was not found on this server. 

Cuando llamo a la acción del controlador sin ningún parámetro o con el parámetro "AAA" funciona. Estos funcionan URI:

/controller/action 
/controller/action/par1/aaa 
/controller/action/par1/jfhsdajkhfui454fs 
/controller/action/par1 
/controller/action/par1/ 

Usted puede poner http://example.com frente a todos los URI relativos anteriores y es el mismo.

Respuesta

9

Usted está casi haciendo bien. El único pequeño error es que urlencode preferirá usar un signo más para indicar un espacio, que solo es apropiado en los parámetros de consulta y no en la parte de ruta. rawurlencode sería mejor aquí.

Sin embargo, esa no es la razón por la que no funciona. Ya está generando la ruta /controller/action/par1/%2F, que es correcta.

No funciona en la práctica para usted porque Apache está tratando de protegerlo (de una manera bastante ineficaz) de problemas de cruce de directorios. Si incluye una secuencia %2F en una ruta de URL, Apache saltará de manera predeterminada y mostrará su propia página 404 (ignorando cualquier configuración de documento de error). Para desactivar esta característica (IMO: misfeature), puede usar la directiva de configuración AllowEncodedSlashes.

Si se puede recuperar la barra diagonal cuando se vuelve a la secuencia de comandos es otra lata de gusanos. Debido al mal diseño de la variable PATH_INFO en la especificación CGI original, muchos entornos no podrán ver el %2F como algo diferente de un / no codificado, lo que podría romper el enrutamiento que está haciendo desde las partes del camino.

Por lo general, es mejor evitar tener barras en las partes de la ruta, porque Apache no es el único servidor o idioma que se confundirá. En general, debe usar parámetros de consulta para la entrada donde necesite poder aceptar cualquier cadena de bytes o caracteres, porque las partes de ruta tienen problemas prácticos en muchos servidores con (a) /, (b) \, (c) el carácter NUL y (d) cadenas vacías.

+0

En realidad logré resolver esto usando URI como este:/controller/action? Ret =% 2F :) –

+0

Respuesta muy informativa, bobince.No estaba familiarizado con la opción de configuración AllowEncodedSlashes, yo mismo. –

2

Probar %2F. No creo que urlencode vaya a codificar '/' porque es una sintaxis de URL válida.

[Editar]: agradezco los votos, pero parece que mi respuesta es incorrecta. Vea la respuesta correcta de bobince (y mucho más detallada) debajo de arriba.

+0

'urlencode' no codifica'/'. – bobince

Cuestiones relacionadas