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

im пытается создать строку url, которая работает следующим образом:

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

так, другими словами,

/app/process/$URL

i, затем верните URL с

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

прямая косая черта в URL-адресе, конечно, будет проблемой при доступе к сегментам uri, так что продолжайте и URL-адрес кодировать часть 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 передних косых символов разбивает CIs URI-парсер.

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

4 ответа

Я думаю, что сообщение об ошибке, которое вы получаете, не от 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, которые вы передаете в сегментах 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~%.:_\-';


С CodeIgniter путь к URL-адресу соответствует контроллеру, функции в контроллере и параметрам функции.

Ваш URL,/app/process/example.com/index.html, будет соответствовать контроллеру app.php, функции процесса внутри и двум параметрам example.com и index.html:

изменить: При перечитывании вашего вопроса кажется, что вы хотите интерпретировать часть URL как другой URL. Для этого вам нужно написать свою функцию, чтобы принять переменное количество аргументов. Для этого вы можете использовать функции func_num_args и func_get_arg следующим образом:

licensed under cc by-sa 3.0 with attribution.