Символ процента в CodeIgniter URI

Просто у вас уже есть объект с Object.new, но у вас все еще нет объекта при использовании синтаксиса конструктора.

5
задан imlouisrussell 1 January 2012 в 15:45
поделиться

2 ответа

Поместите « - » в конец строки, иначе она будет интерпретирована как диапазон. % Уже находится в списке разрешенных символов, как вы можете видеть.

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

Гм ... после повторного просмотра вашей строки образца. Вот почему вы получаете: « Отправленный вами URI содержит запрещенные символы ».

Краткое объяснение : Добавьте амперсанд и в список разрешенных символов

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+&-';

Длинное объяснение

Две вещи играют вместе.

A) CodeIgniter проверяет все сегменты URI на наличие запрещенных символов. Это происходит путем добавления разрешенных символов в белый список. Какие из них разрешены, можно проверить в / system/application/config/config.php в переменной $ config ['allowed_uri_chars'] . По умолчанию установлено что-то вроде 'az 0-9 ~%.: _-' . Таким образом, разрешены все буквы от a до z, пробел, все числа и следующие символы * ~%.: _-.

Хорошо, давайте сравним это с вашим образцом URI, который, по вашему мнению, работает

a-z 0-9~%.:_-
DO_SOMETHING/Coldplay/Fix+You/273/X+26+Y/   //note the missing %

Все символы в порядке. .. но подождите, а что насчет плюса + ? Его нет в списке разрешенных символов! А еще на URI не жалуются? Это ключ к вашей проблеме.

B) CodeIgniter urldecodes сегменты URI перед проверкой символов белого списка, чтобы предотвратить обход проверки путем простого urlencoding URI. Таким образом, + декодируется в пробел. Такое поведение происходит из-за urlencode (который кодирует пробелы как знак + , в отличие от RFC 1738 ). Это объясняет, почему разрешен знак + .

Эти две вещи вместе объясняют также, почему этот конкретный URI не работает.

urldecode(DO_SOMETHING/Coldplay/Fix+You/273/X+%26+Y/) //evaluates to
//DO_SOMETHING/Coldplay/Fix You/273/X & Y/

Упс ... расшифровка URL переводит % 26 ] на &

. Это недопустимый символ. Тайна ;-) решена

26
ответ дан 18 December 2019 в 06:12
поделиться

попробуйте это: $ config ['uri_protocol'] = "PATH_INFO";

0
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: