я пытаюсь создать строку URL, которая работает следующим образом:
/app/process/example.com/index.html
другими словами,
/app/process/$URL
Затем я получаю URL-адрес с помощью
$this->uri->segment(3);
косая черта в URL-адресе, конечно, будет проблемой при доступе к сегментам URI, поэтому я продолжу и закодирую URL-адрес:
/app/process/example.com%2Findex.html
.. но теперь я просто получаю сообщение 404 ...
Not Found
The requested URL /app/process/example.com/index.html was not found on this server.
похоже, что мой URL-адрес с косой чертой нарушает синтаксический анализатор URI CI.
что я могу сделать, чтобы обойти эту проблему?






В CodeIgniter путь URL-адреса соответствует контроллеру, функции в контроллере и параметрам функции.
Ваш URL-адрес /app/process/example.com/index.html будет соответствовать контроллеру app.php, внутренней функции процесса и двум параметрам example.com и index.html:
<?php
class App extends Controller {
function process($a, $b) {
// at this point $a is "example.com" and $b is "index.html"
}
}
?>
редактировать: При перечитывании вашего вопроса кажется, что вы хотите интерпретировать часть URL-адреса как другой URL-адрес. Для этого вам нужно написать свою функцию, принимающую переменное количество аргументов. Для этого вы можете использовать функции func_num_args и func_get_arg следующим образом:
<?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
}
}
?>
Я думаю, что вы получаете сообщение об ошибке не от codeigniter, а от вашего веб-сервера.
Я воспроизвел это с помощью Apache2, даже не используя CodeIgniter: я создал файл index.php, а затем обратился к index.php/a/b/c - он работал нормально. Если я затем попытался получить доступ к index.php/a/b/c%2F, я получил 404 от Apache.
Я решил это, добавив в свою конфигурацию Apache:
AllowEncodedSlashes On
См. документация для получения дополнительной информации.
Как только вы это сделаете, вам, возможно, придется повозиться с $config['permitted_uri_chars'] в codeigniter, если он все еще не работает - вы можете обнаружить, что косые черты отфильтрованы.
Я только что исправил эту проблему на сайте. Это немного похоже на взлом, но он выполнил свою работу: я дважды закодировал URL-адрес. Таким образом, urldecode REQUEST_URI не откатывает / слишком рано.
На самом деле, то, что вам нужно, это, вероятно, AllowEncodedSlashes NoDecode
Забыл упомянуть, что для этого требуется минимум Apache 2.3. Если вы застряли ниже этого, попробуйте использовать / для косых черт, а затем str_replace, перемещая их туда и обратно по мере необходимости. Они будут отображаться нормально, как в html.
Один из способов обойти эту проблему - заменить любые косые черты в вашей переменной URL, которые вы передаете в сегментах URI, чем-то, что не нарушит работу парсера URI CodeIgniter. Например:
$uri = 'example.com/index.html';
$pattern = '"/"';
$new_uri = preg_replace($pattern, '_', $uri);
Это заменит все ваши косые черты на символы подчеркивания. Я уверен, что это похоже на то, что вы делаете, чтобы закодировать косую черту. Затем при получении значения на другой странице просто используйте что-то вроде следующего:
$pattern = '/_/';
$old_uri = preg_replace($pattern, '/', $new_uri);
Это заменит все подчеркивания на косую черту, чтобы вернуть ваш старый URI. Конечно, вы захотите убедиться, что какой бы символ вы ни использовали (в данном случае подчеркивание), не будет присутствовать ни в одном из возможных URI, которые вы будете передавать (так что вы, вероятно, вообще не захотите использовать подчеркивание).
Измените ваш индекс allowed_uri_chars в файле конфигурации
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
Это правильно. Однако даже после исправления вы можете столкнуться с проблемами, поскольку стандарт CGI, который определяет PATH_INFO, требует, чтобы строки проходили цикл декодирования URL-адресов, что может нарушить косую черту. Только на Apache вы можете использовать REQUEST_URI вместо этого, который не страдает от этого ... не знаю, может ли CI использовать это.