我需要将编码字符串传递给 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~%.:_+-';
咳咳……在再次查看您的示例字符串之后。这就是您收到“您提交的 URI 包含不允许使用的字符
”的原因。
简短说明:将&符号&添加到允许的字符列表
$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 进行 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 转换为 &
这不是允许的字符。谜团 ;-) 解决了
关于php - CodeIgniter URI 中的百分比符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1021609/