CodeIgniter URI中的百分比符号

时间:2009-06-20 13:20:25

标签: php regex codeigniter

我需要将编码的字符串传递给CodeIgniter控制器。

示例

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

我的问题是百分比符号是一个不允许的字符。我试图用以下内容更改配置文件:

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

+没问题,但%无效。你能帮我修改一下这个reg exp,它会允许%符号吗?提前谢谢!

2 个答案:

答案 0 :(得分:25)

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

$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,空格,所有数字和以下字符*〜%。:_-的所有字母。

好的,让我们将它与你说的工作原理

进行比较
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 翻译为&

哪个不是允许的角色。神秘;-)解决了

答案 1 :(得分:0)

试试这个: $ config ['uri_protocol'] =“PATH_INFO”;