2010-08-23 28 views
5

tengo una URL que contenga lo siguiente:Apache:% 25 en url (400 Bad Request)

/somepath/morestuff/ohno%25foobar 

Por alguna razón Apache está reportando una solicitud incorrecta 400 (que tiene algo que ver con el% 25) . Estoy usando mod_rewrite para reescribir la ruta para apuntar a mi instancia codeigniter pero ni siquiera está llegando a codeigniter, es solo el error de apache predeterminado.

¿Alguna idea?

+0

¿Hay alguna razón por la que necesite '% 25'? '% 25' es el código para un signo'% '. – Powerlord

+0

@Bemrose, en realidad es para una API donde las personas pueden publicar cualquier cadena. –

Respuesta

11

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 escapeRewriteMap 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.

+0

Estoy ejecutando apache 2.2 pero esa bandera B no funcionó ... causó un 500. –

+0

@Ken Struys - ¿Qué dice tu registro de errores acerca del 500? –

+0

dice que la bandera B es desconocida. Estoy ejecutando 2.2.3 y 2.2.7 agregué la bandera B. Tengo acceso completo al servidor (no al servidor compartido), así que puedo hacer lo que sea necesario para apache. –

1

En jQuery antes de ponerse a URL que tiene que codificar como esto este codificará% y/tanto ..... "encodeURI (encodeURI (encodeURIComponent ('su cadena')));"

en php o una página vista en la que tiene que decodificar como seguir

urldecode (urldecode (htmlspecialchars ('su cadena codificada' , ENT_QUOTES)))

Cuestiones relacionadas