在Codeigniter中加密uri段

我想加密作为ID传递给数据库表的URI段。 例如我正在使用
$id=urlencode($this->encrypt->encode($user[\'id\']));
在另一个控制器上使用
$id_decrypt=$this->encrypt->decode(urldecode($id));
我已经测试了加密和解密,并且似乎可以正常工作。但是,在尝试网址例如。
http://localhost/app_name/index.php/profile/view_profile/b98N98YNqoEA7yI1tavIY1s51RhiSHKGCFarU4A6XgFUMB%2BI3KwiEA23h1XITmkq1qPABqGs8e1sdP16v4og8g%3D%3D
在某些网址上可以正常工作,但在某些网址上会显示浏览器错误404(找不到对象)。在删除加密的段时,我可以访问索引功能。这可能是什么原因?     
已邀请:
        在文件./application/config/config.php中,有一个部分用于允许的uri字符。默认字符为:
$config[\'permitted_uri_chars\'] = \'a-z 0-9~%.:_-;
在某些项目中,我也对此进行了更改:
$config[\'permitted_uri_chars\'] = \'a-z 0-9~%.:_\\\'+,-=\';
但是,正如CodeIgniter工程师所说   除非您完全理解本说明,否则请不要更改它!     
        我认为您遇到的问题是5英镑符号。解码后,
%2B
变成
+
。 CI的网址路由器在解码的网址上运行。
+
是用于表示空格的url中的特殊字符。这可能会触发url路由器。 更新: 这实际上可能与CI中的XSS保护脚本有关。有一个接受的URL字符列表,它会根据输入来检查输入。您使用的加密确实会在输入中添加许多有趣的字符。 (
%3D
=
)。这些(包括+)可能是绊脚石。 要解决此问题: 您可以使用其他加密算法。您知道的一个不会添加时髦的字符。 您可以对结果进行Base64编码。 Base64不应返回字母数字字符以外的任何字符(如果我没记错的话)。但是请注意,这可能会使结果变长。 (不推荐),您可以在CI配置的xss过滤部分中编辑“允许的字符”。     

要回复问题请先登录注册