Pregunta

Necesito pasar una cadena codificada a un controlador CodeIgniter.

Ejemplo :

DOSOMETHING/Coldplay/Fix+You/273/X+%26+Y/

Mi problema es el símbolo de porcentaje que es un carácter no permitido. Intenté cambiar el archivo de configuración con lo siguiente:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\+\%';

El + está bien, pero el % no es válido. ¿Me pueden ayudar a cambiar este registro exp para que permita el símbolo % ? Gracias de antemano!

¿Fue útil?

Solución

Ponga el " - " al final de la cadena, de lo contrario, se interpreta como rango. El% ya está en la lista de caracteres permitidos, como puede ver.

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+-';

Ejem ... después de mirar tu cadena de muestra nuevamente. Aquí es por qué obtienes " El URI que enviaste tiene caracteres no permitidos " ;.

Breve explicación : agregue el ampersand & amp; a la lista de caracteres permitidos

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+&-';

Explicación larga

Hay 2 cosas jugando juntas.

A) CodeIgniter comprueba todos los segmentos URI en busca de caracteres no permitidos. Esto sucede al incluir en la lista blanca los caracteres permitidos. Los que están permitidos se pueden verificar en /system/application/config/config.php en la variable $ config ['allow_uri_chars'] . El valor predeterminado se establece en algo como 'a-z 0-9 ~%.: _-' . Por lo tanto, todas las letras de la a a la z, el espacio, todos los números y los siguientes caracteres * ~%.: _- están permitidos.

Ok, comparemos eso con su URI de muestra que usted dice que funciona

a-z 0-9~%.:_-
DO_SOMETHING/Coldplay/Fix+You/273/X+26+Y/   //note the missing %

Todos los caracteres están bien ... pero espere, ¿qué pasa con el signo más + ? ¡No está en la lista de personajes permitidos! ¿Y sin embargo, el URI no se queja? Esta es la clave de su problema.

B) CodeIgniter urldecodes los segmentos de URI anteriores al carácter de la lista blanca -check para evitar que alguien eluda el cheque simplemente codificando el URI. Así, el + se decodifica en un espacio. Este comportamiento se debe a urlencode (que codifica espacios como signo + , desviándose de RFC 1738 ). Eso explica por qué está permitido el signo + .

Estas dos cosas combinadas explican también por qué este URI específico no funciona.

urldecode(DO_SOMETHING/Coldplay/Fix+You/273/X+%26+Y/) //evaluates to
//DO_SOMETHING/Coldplay/Fix You/273/X & Y/

Whoops ... la codificación url traduce % 26 a &

Que no es un personaje permitido. Misterio ;-) resuelto

Otros consejos

prueba esto: $ config ['uri_protocol'] = " PATH_INFO " ;;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top