我需要将编码后的字符串传递给CodeIgniter Controller 。

示例:

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

我的问题是百分号,这是一个不允许的字符。我尝试使用以下方法更改配置文件:
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-\+\%';
+可以,但是%无效。您能帮我更改此reg exp,以便允许%符号吗?提前致谢!

最佳答案

将“-”放在字符串的末尾,否则它将被解释为范围。如您所见,%已在允许的字符列表中。

$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 中是否存在不允许的字符。这是通过将允许的字符列入白名单来实现的。可以在$config['permitted_uri_chars']变量的/system/application/config/config.php中检查允许哪些。默认值设置为'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进行urlencoding来绕过该检查。因此, + 被解码为一个空格。此行为是由于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 转换为

这是不允许的字符。先生;-)解决了

09-30 13:24
查看更多