Sospecho que está usando PATH_INFO
para manejar sus solicitudes CodeIgniter. En consecuencia, el archivo .htaccess
contiene un conjunto de reglas que se parece a esto:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php/$0 [L]
Cuando mod_rewrite
pone a prueba su URL, que ya han sido decodificados a su formato de carácter natural, por lo que en este caso se ha convertido en %25
simplemente %
. Cuando aplica esta regla, la referencia inversa en realidad contiene el texto literal somepath/morestuff/ohno%foobar
, que es no recodificado de forma predeterminada. Apache no tiene idea de qué es lo que %
está haciendo en su ruta de solicitud al /index.php/somepath/morestuff/ohno%foobar
y ahoga, lo que le da ese error.
Si está ejecutando Apache 2.2, mod_rewrite
agregó el indicador B
para este propósito, lo que le permite escapar automáticamente de las referencias reescritas a su URL. Agregarlo a su lista actual bandera debería solucionar el problema en ese caso:
RewriteRule ^.*$ index.php/$0 [B,L]
También hay un escape
RewriteMap
que está disponible como un mapa interno en las anteriores versiones de Apache de mod_rewrite
, pero desafortunadamente este mapa tiene que estar habilitado en el nivel de configuración de servidor o servidor virtual, por lo que puede no estar disponible si está ejecutando su sitio en alojamiento compartido. Hace lo mismo, aunque un poco más deliberadamente.
En la configuración del servidor/servidor virtual:
RewriteMap escape int:escape
Entonces, dondequiera que definen sus reglas:
RewriteRule ^.*$ index.php/${escape:$0} [L]
Tenga en cuenta que CodeIgniter no necesita utilizar PATH_INFO
para obtener la solicitud información, y el uso de REQUEST_URI
es perfectamente aceptable aquí si no está usando mod_rewrite
para hacer otras transformaciones (y evitaría este dolor de cabeza por completo). Creo que por defecto CodeIgniter está configurado para obtener la solicitud de AUTO
(asumiendo que no he confundido mis frameworks), así que simplemente no reescribir la solicitud a la URL con información de ruta sería suficiente para hacer ese cambio.
¿Hay alguna razón por la que necesite '% 25'? '% 25' es el código para un signo'% '. – Powerlord
@Bemrose, en realidad es para una API donde las personas pueden publicar cualquier cadena. –