将“
- ”放在字符串末尾,否则它会被解释为范围。 正如你所看到的那样,“%”已经包含在允许使用的字符列表中。
$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 在白名单字符检查之前对 URI 段进行url解码,以防止某些人通过简单地对 URI 进行 url 编码来规避检查。因此,+被解码为一个空格。这种行为是由于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 转换为一个 &
这不是一个允许的字符。神秘地解决了 ;-)