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