php - rawurlencode - barras diagonales codificadas en URL que rompen mi aplicación codeigniter
urlencode php (4)
Creo que el mensaje de error que recibes no proviene de codeigniter, sino de tu servidor web.
Repliqué esto usando Apache2 sin usar CodeIgniter: Creé un archivo index.php, y luego index.php/a/b/c
a index.php/a/b/c
- funcionó bien. Si luego intenté acceder a index.php/a/b/c%2F
obtuve un 404 de Apache.
Lo resolví agregando a mi configuración de Apache:
AllowEncodedSlashes On
Ver la documentación para más información
Una vez que hayas hecho esto, es posible que tengas que jugar con $config[''permitted_uri_chars'']
allowed_uri_chars $config[''permitted_uri_chars'']
en codeigniter si todavía no funciona: es posible que las barras se filtren
Estoy tratando de crear una cadena de URL que funcione así:
/app/process/example.com/index.html
entonces en otras palabras,
/app/process/$URL
luego recupero la url con
$this->uri->segment(3);
las barras diagonales en la URL serán, por supuesto, un problema para acceder a los segmentos uri, así que continuaré y codificaré la URL por URL.
/app/process/example.com%2Findex.html
.. pero ahora solo obtengo un 404 diciendo ...
Not Found
The requested URL /app/process/example.com/index.html was not found on this server.
parece que mi codificación de url de barras diagonales rompe el analizador URI de CI.
¿Qué puedo hacer para evitar este problema?
Una forma de evitar este problema sería reemplazar cualquier barra diagonal en su variable URL que está pasando en los segmentos URI con algo que no rompa el analizador URI CodeIgniter. Por ejemplo:
$uri = ''example.com/index.html'';
$pattern = ''"/"'';
$new_uri = preg_replace($pattern, ''_'', $uri);
Esto reemplazará todas las barras diagonales con guiones bajos. Estoy seguro de que es similar a lo que está haciendo para codificar sus barras diagonales. Luego, al recuperar el valor en la otra página simplemente use algo como lo siguiente:
$pattern = ''/_/'';
$old_uri = preg_replace($pattern, ''/'', $new_uri);
Que reemplazará todos los guiones bajos con barras diagonales para recuperar su viejo URI. 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).
Cambie su índice allowed_uri_chars en el archivo de configuración
$config[''permitted_uri_chars''] = ''a-z 0-9~%.:_/-'';
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, correspondería al controlador app.php, la función de proceso adentro, y dos parámetros example.com e index.html:
<?php
class App extends Controller {
function process($a, $b) {
// at this point $a is "example.com" and $b is "index.html"
}
}
?>
editar: 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 hacer esto, puede usar las funciones func_num_args y 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
}
}
?>