Url-кодированные косые черты нарушают мое приложение codeigniter

я пытаюсь создать строку 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.

что я могу сделать, чтобы обойти эту проблему?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
13
0
15 658
4

Ответы 4

В 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, если он все еще не работает - вы можете обнаружить, что косые черты отфильтрованы.

Это правильно. Однако даже после исправления вы можете столкнуться с проблемами, поскольку стандарт CGI, который определяет PATH_INFO, требует, чтобы строки проходили цикл декодирования URL-адресов, что может нарушить косую черту. Только на Apache вы можете использовать REQUEST_URI вместо этого, который не страдает от этого ... не знаю, может ли CI использовать это.

bobince 23.11.2008 02:36

Я только что исправил эту проблему на сайте. Это немного похоже на взлом, но он выполнил свою работу: я дважды закодировал URL-адрес. Таким образом, urldecode REQUEST_URI не откатывает / слишком рано.

Gary Richardson 24.11.2009 03:19

На самом деле, то, что вам нужно, это, вероятно, AllowEncodedSlashes NoDecode

celwell 19.02.2014 04:01

Забыл упомянуть, что для этого требуется минимум Apache 2.3. Если вы застряли ниже этого, попробуйте использовать &#47; для косых черт, а затем str_replace, перемещая их туда и обратно по мере необходимости. Они будут отображаться нормально, как в html.

celwell 19.02.2014 04:14

Один из способов обойти эту проблему - заменить любые косые черты в вашей переменной 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~%.:_\-';

Другие вопросы по теме