Поставьте « - » в конце строки, иначе она будет интерпретирована как диапазон. Как вы видите,% уже находится в списке разрешенных символов.
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+-';
Гм ... после того, как вы снова посмотрите на образец строки. Вот почему вы получаете "The URI you submitted has disallowed characters
".
Краткое объяснение : Добавить амперсанд & в список разрешенных символов
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+&-';
Длинное объяснение
Есть две вещи, играющие вместе.
A) CodeIgniter проверяет все сегменты URI на наличие запрещенных символов. Это происходит путем внесения в белый список разрешенных символов. Какие из них разрешены, можно проверить в /system/application/config/config.php в переменной $config['permitted_uri_chars']
. Значением по умолчанию является что-то вроде 'a-z 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 перед проверкой символов белого списка, чтобы не допустить того, чтобы кто-то обошел проверку путем простого кодирования 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 в &
Какой недопустимый символ. Mistery ;-) решено