php - CodeIgniter URI 中的百分比符号

标签 php regex codeigniter

我需要将编码字符串传递给 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/

相关文章:

javascript - 正则表达式模式匹配小问题与模式匹配中的括号

用于查找基本 URL 的 Javascript 正则表达式

codeigniter - 设置 CodeIgniter 4.2 时如何解决错误 "unexpected ' _592_00 0'"?

php - PDO:fetchClass未设置父类的属性

php - "Last minute subscription"项目 PHP/MySQL 原子性问题

ruby - 如何从 Ruby 中的字符串中去除括号?

php - codeigniter 上的错误 undefined variable 替代

php - Swift_Mailer + symfony UTF-8

php - 交响乐/主义 : Getting the first maximum value from database

php - Backbone JS + Codeigniter Restful API 和 MYSQL 子字符串功能不起作用