相信不少人遇到 Disallowed Key Characters 这样的问题,即便是在访问 CSDN 的时候,由于 CSDN 的那部分网页是用 CI 写的,这个问题就出在 CI 的处理提交字符串的类上面。即便只是输入域名。没什么特殊字符,这问题仍是如影随形,为何呢?php
这和 CI 的字符串处理类设计有关,是这样的,经过get、post方法提交的字符串,CI 都交给 system/core/Input.php 这个类去处理,那不少人就问了,看url并无特殊符号,为何也报这样的错误,由于你忽略了一点,cookie 和 session 传输的字符串,也是由这个类统一处理的,也就是说,get、post、cookie、session 的数据都是由这个类处理的,问题每每也出如今 cookie 和 session 上面,因此网上有不少人提供方法就是,清除一下缓存和 cookie ,确实就没问题了,可是隔一段时间就又有问题了,由于新生成的 cookie 里面含有不被匹配经过的字符串,该怎么解决呢? 解铃还需系铃人,既然问题出如今 Input.php 这个类上面,就修改他就好,把 _clean_input_keys 方法:
function clean_input_keys($str) { if ( ! preg_match("/^[a-z0-9:/-]+$/i", $str)) { exit('Disallowed Key Characters.'); }缓存
// Clean UTF-8 if supported if (UTF8_ENABLED === TRUE) { $str = $this->uni->clean_string($str); } return $str;
} 改成:cookie
function clean_input_keys($str) { /*if ( ! preg_match("/^[a-z0-9:/-]+$/i", $str)) { exit('Disallowed Key Characters.'); }*/ $config = &get_config('config');
if (!emptyempty($config['permitted_uri_chars'])) { if ( ! preg_match("/^[".$config['permitted_uri_chars']."]+$/i", rawurlencode($str)))
{
exit('Disallowed Key Characters.');
}
}session
// Clean UTF-8 if supported if (UTF8_ENABLED === TRUE) { $str = $this->uni->clean_string($str); } return $str;
} 而后把 config/config.php 里面的:post
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-'; 改成:this
$config['permitted_uri_chars'] = ''; 便可url
自此问题解决,不懂的朋友能够理解一下上面这几段代码,但愿有所帮助。