2008-11-22 19 views
13

que estoy tratando de crear una cadena de URL que funciona así:URL codificada barras diagonales que rompen mi aplicación CodeIgniter

/app/process/example.com/index.html 

por lo que en otras palabras,

/app/process/$URL 

entonces recuperar la dirección URL con

$this->uri->segment(3); 

barras inclinadas en la dirección URL, por supuesto, ser un problema para acceder a segmentos de URI, así que iré AHEA d URL y codifican la porción URL:

/app/process/example.com%2Findex.html 

.. pero ahora sólo reciben un 404 diciendo ...

Not Found 

The requested URL /app/process/example.com/index.html was not found on this server. 

parece que mi URL codificación de barras diagonales rompe analizador URI de CI.

¿Qué puedo hacer para evitar este problema?

Respuesta

0

Con CodeIgniter, la ruta de la URL corresponde a un controlador, una función en el controlador y los parámetros de la función.

su URL, /app/process/example.com/index.html, que correspondería al controlador app.php, la función de proceso en el interior, y dos parámetros example.com y index.html:

<?php 
class App extends Controller { 
    function process($a, $b) { 
     // at this point $a is "example.com" and $b is "index.html" 
    } 
} 
?> 

edición: Al volver a leer su pregunta, parece que desea interpretar parte de la URL como otra URL. Para hacer esto, necesita escribir su función para tomar una cantidad variable de argumentos. Para ello, puede utilizar las funciones y func_num_args func_get_arg de la siguiente manera:

<?php 
class App extends Controller { 
    function process() { 
     $url = ""; 
     for ($i = 0; $i < func_num_args(); $i++) { 
      $url .= func_get_arg($i) . "/"; 
     } 

     // $url is now the url in the address 
    } 
} 
?> 
9

Creo que el mensaje de error que está recibiendo no es de CodeIgniter pero a partir de su servidor web.

He replicado esto usando Apache2 sin siquiera usar CodeIgniter: Creé un archivo index.php, y luego accedí a index.php/a/b/c - funcionó bien. Si luego intenté acceder al index.php/a/b/c%2F, obtuve un 404 de Apache.

Lo resuelto añadiendo a mi configuración de Apache:

AllowEncodedSlashes On

Ver the documentation para más información

Una vez que haya hecho esto puede que tenga que ver alrededor de $config['permitted_uri_chars'] en CodeIgniter si sigue sin funcionar: es posible que las barras se filtren

+1

Esto es correcto. Sin embargo, incluso cuando está solucionado, puede tener problemas, ya que el estándar CGI que define PATH_INFO requiere que las cadenas atraviesen una ronda de descodificación de URL, lo que puede romper la barra. Solo en Apache, puede usar REQUEST_URI en su lugar, que no sufre de esto ... no sé si CI puede usar eso. – bobince

+3

Acabo de solucionar este problema en un sitio. Esto es un truco, pero hizo el trabajo: doblé el urlencoded de la URL. De esta forma, el urldecode de REQUEST_URI no revierte los/'s demasiado pronto. –

+0

En realidad, lo que quiere es probablemente 'AllowEncodedSlashes NoDecode' – celwell

4

Una forma de evitar este problema sería reemplazar cualquier barra inclinada en su U Variable RL que está pasando en los segmentos URI con algo que no rompería el analizador URI de CodeIgniter. Por ejemplo:


$uri = 'example.com/index.html'; 
$pattern = '"/"'; 
$new_uri = preg_replace($pattern, '_', $uri); 

Esto reemplazará todas sus barras diagonales con guiones bajos. Estoy seguro de que es similar a lo que está haciendo para codificar sus barras diagonales.A continuación, cuando se recupera el valor en la otra página sólo tiene que utilizar algo como lo siguiente:


$pattern = '/_/'; 
$old_uri = preg_replace($pattern, '/', $new_uri); 

que sustituirá a todos los guiones con barras diagonales para obtener su edad URI espalda. Por supuesto, querrás asegurarte de que el personaje que uses (guion bajo en este caso) no esté presente en ninguno de los posibles URI que estarás transmitiendo (por lo que probablemente no quieras utilizar el guion bajo).

0

Cambiar su índice de permitted_uri_chars en el archivo de configuración

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