Мне нужно передать закодированную строку в контроллер CodeIgniter.
Пример :
DOSOMETHING/Coldplay/Fix+You/273/X+%26+Y/
Моя проблема – это символ процента, который является запрещенным символом. Я попытался изменить файл конфигурации следующим образом:
$config['permitted_uri_chars'] = 'az 0-9~%.:_\-\+\%';
+
Нормально, но %
недействительно. Можете ли вы помочь мне изменить этот reg exp, чтобы он дал символ %
? Заранее спасибо!
Поместите символ « – » в конец строки, иначе он будет интерпретироваться как диапазон. % Уже находится в списке разрешенных символов, как вы можете видеть.
$config['permitted_uri_chars'] = 'az 0-9~%.:_+-';
Гм … снова посмотрим на вашу примерную строку. Вот почему вы получаете « The URI you submitted has disallowed characters
».
Краткое объяснение : добавьте амперсанд и список разрешенных символов
$config['permitted_uri_chars'] = 'az 0-9~%.:_+&-';
Длительное объяснение
Есть две вещи, играющие вместе.
A) CodeIgniter проверяет все сегменты URI для запрещенных символов. Это происходит с помощью разрешенных символов. Какие из них разрешены, можно проверить в / system / application / config / config.php в переменной $config['permitted_uri_chars']
. Значение по умолчанию установлено на 'az 0-9~%.:_-'
. Таким образом, все буквы от a до z, пробел, все числа и следующие символы * ~%.: _- разрешены.
Хорошо, сравним это с вашим образцом URI, который, как вы говорите, работает
az 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/
Упс … urldecoding переводит % 26 в &
Это не разрешенный характер. Мистерий 😉 решил
попробуйте следующее: $ config ['uri_protocol'] = "PATH_INFO";