urlencoded La barra diagonal está rompiendo URL

Sobre el sistema

Tengo URL de este formato en mi proyecto:

http://project_name/browse_by_exam/type/tutor_search/keyword/class/new_search/1/search_exam/0/search_subject/0 

Donde palabra clave / par de clase significa búsqueda con palabra clave “clase”.

Tengo un archivo index.php común que se ejecuta para cada módulo en el proyecto. Solo hay una regla de reescritura para eliminar el index.php de la URL: –

 RewriteCond $1 !^(index\.php|resources|robots\.txt) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L,QSA] 

Estoy usando urlencode () mientras preparo la URL de búsqueda y urldecode () mientras leo la URL de búsqueda.

Problema

Solo el carácter de barra diagonal está rompiendo URL causando el error de 404 página no encontrada. Por ejemplo, si busco one/two la URL es

 http://project_name/browse_by_exam/type/tutor_search/keyword/one%2Ftwo/new_search/1/search_exam/0/search_subject/0/page_sort/ 

¿Cómo puedo solucionar esto? Necesito mantener index.php oculto en la URL. De lo contrario, si no fuera necesario, no habría habido ningún problema con la barra diagonal y podría haber utilizado esta URL: –

 http://project_name/index.php?browse_by_exam/type/tutor_search/keyword/one %2Ftwo/new_search/1/search_exam/0/search_subject/0 

Apache niega todas las URL con %2F en la parte de la ruta, por razones de seguridad: las secuencias de comandos normalmente no pueden decir (es decir, sin reescribir) la diferencia entre %2F y / debido a que la variable de entorno PATH_INFO decodifica automáticamente mediante URL (lo cual es estúpido , pero una parte antigua de la especificación CGI por lo que no se puede hacer nada al respecto).

Puede desactivar esta característica usando la directiva AllowEncodedSlashes , pero tenga en cuenta que otros servidores web todavía no lo permitirán (sin opción para desactivarlo), y que otros caracteres también pueden ser tabú (por ejemplo, %5C ) y que %00 en particular, siempre estará bloqueado tanto por Apache como por IIS. Entonces, si su aplicación dependía de poder tener %2F u otros caracteres en una parte de la ruta, estaría limitando sus opciones de compatibilidad / implementación.

Estoy usando urlencode () mientras preparo la URL de búsqueda

Debería usar rawurlencode() , not urlencode() para escapar de partes de ruta. urlencode() tiene un nombre erróneo, en realidad se trata de datos application/x-www-form-urlencoded , como en la cadena de consulta o en el cuerpo de una solicitud POST, y no para otras partes de la URL.

La diferencia es que + no significa espacio en las partes de la ruta. rawurlencode() producirá correctamente %20 , que funcionará tanto en datos codificados en formularios como en otras partes de la URL.

En Apache, AllowEncodedSlashes On evitaría que la solicitud sea inmediatamente rechazada con un 404.

Solo otra idea sobre cómo solucionar esto.

Reemplace% 2F con% 252F después de la encoding url

PHP

 function custom_http_build_query($query=array()){ return str_replace('%2F','%252F', http_build_query($query)); } 

Manejar la solicitud a través de htaccess

.htaccess

 RewriteCond %{REQUEST_URI} ^(.*?)(%252F)(.*?)$ [NC] RewriteRule . %1/%3 [R=301,L,NE] 

Recursos

http://www.leakon.com/archives/865

 $encoded_url = str_replace('%2F', '/', urlencode($url)); 

Tuve el mismo problema con slash en url get param, en mi caso el código php funciona:

 $value = "hello/world" $value = str_replace('/', '/', $value;?> $value = urlencode($value);?> # $value is now hello%26%2347%3Bworld 

Primero reemplazo la barra por entidad html y luego hago la encoding url.

En mi cuenta de hosting, este problema fue causado por una regla ModSecurity que se estableció para todas las cuentas automáticamente. Al informar este problema, su administrador eliminó rápidamente esta regla para mi cuenta.

Usa un personaje diferente y reemplaza el lado del servidor de barras oblicuas

por ejemplo, Drupal.org usa% 21 (¡el carácter de la marca de exclamación!) para representar la barra en un parámetro url.

Ambos enlaces a continuación funcionan:

https://api.drupal.org/api/drupal/includes%21common.inc/7

https://api.drupal.org/api/drupal/includes!common.inc/7

Si le preocupa que el personaje pueda entrar en conflicto con un personaje en el parámetro, utilice una combinación de caracteres.

Por lo tanto, su URL sería http: // nombre_del_proyecto / browse_by_exam / type / tutor_search / keyword / one_-! Two / new_search / 1 / search_exam / 0 / search_subject / 0

cámbielo por js y conviértalo de nuevo al lado del servidor de corte.

Una solución estándar para este problema es permitir barras inclinadas haciendo que el parámetro que puede contener barras el último parámetro en la url.

Para una URL de código de producto, entonces tendrías …

 mysite.com/product/details/PR12345/22 

Para un término de búsqueda que tendrías

 http://project/search_exam/0/search_subject/0/keyword/Psychology/Management 

(La palabra clave aquí es Psicología / Gestión)

No es una gran cantidad de trabajo procesar los primeros parámetros “nombrados” y luego concat los restantes para ser código de producto o palabra clave.

Algunos marcos tienen esta facilidad incorporada a sus definiciones de enrutamiento.

Esto no es aplicable al caso de uso que involucre dos parámetros que mi contiene barras inclinadas.

es simple para mí usar base64_encode

 $term = base64_encode($term) $url = $youurl.'?term='.$term 

después de decodificar el término

 $term = base64_decode($['GET']['term']) 

de esta manera codificar el “/” y “\”

Utilizo la función javascript encodeURI () para la parte de URL que tiene barras diagonales que deben verse como caracteres en lugar de dirección http. P.ej:

 "/api/activites/" + encodeURI("?categorie=assemblage&nom=Manipulation/Finition") 

vea http://www.w3schools.com/tags/ref_urlencode.asp

Lo resolví usando 2 funciones personalizadas, por ejemplo:

 function slash_replace($query){ return str_replace('/','_', $query); } function slash_unreplace($query){ return str_replace('_','/', $query); } 

Entonces para codificar, podría llamar:

 rawurlencode(slash_replace($param)) 

y para decodificar podría llamar

 slash_unreplace(rawurldecode($param); 

¡Aclamaciones!

Puede usar %2F si lo usa de esta manera:
?param1=value1&param2=value%2Fvalue

pero si usa /param1=value1/param2=value%2Fvalue arrojará un error.