Просто у вас уже есть объект с Object.new
, но у вас все еще нет объекта при использовании синтаксиса конструктора.
Поместите « - » в конец строки, иначе она будет интерпретирована как диапазон. % Уже находится в списке разрешенных символов, как вы можете видеть.
$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 ] на &
. Это недопустимый символ. Тайна ;-) решена
попробуйте это: $ config ['uri_protocol'] = "PATH_INFO";