Символ процента в CodeIgniter URI - PullRequest
4 голосов
/ 20 июня 2009

Мне нужно передать закодированную строку в контроллер CodeIgniter.

Пример

DOSOMETHING/Coldplay/Fix+You/273/X+%26+Y/

Моя проблема - символ процента, который является запрещенным символом. Я попытался изменить файл конфигурации следующим образом:

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

+ в порядке, но % недопустим. Можете ли вы помочь мне изменить этот reg exp, чтобы он позволял символ %? Заранее спасибо!

Ответы [ 2 ]

25 голосов
/ 20 июня 2009

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

$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 ;-) решено

0 голосов
/ 21 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...