2

The URI you submitted has disallowed characters.

如何拦截此错误?它们是callback_函数吗?当我尝试在 URL 中使用 = 时会发生此错误。例如我把 1=1 - 我得到这个错误。而不是我想要的错误页面redirect('main/cate/page');

如何捕获此错误并重定向而不是显示“遇到错误页面”

4

2 回答 2

6

看起来错误正在被抛出system/core/URI.php。幸运的是,您可以扩展核心类application/core在调用中创建一个文件MY_URI.php并覆盖该函数:

class MY_URI extends CI_URI{
    function __construct(){
        parent::__construct();
    }
    function _filter_uri($str){
        if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE)
        {
            // preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards
            // compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern
            if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str))
            {
                redirect('main/cate/page');
            }
        }

        // Convert programatic characters to entities
        $bad    = array('$',        '(',        ')',        '%28',      '%29');
        $good   = array('$',    '(',    ')',    '(',    ')');

        return str_replace($bad, $good, $str);
    }
}
于 2012-09-27T00:42:44.657 回答
1

您需要扩展 CI_Exceptions 文件。该论坛帖子提供了有关异常和错误处理的大量信息。

http://codeigniter.com/forums/viewthread/67096/

与此覆盖类似的东西应该允许您根据错误代码进行重定向:

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
class OOR_Exceptions extends CI_Exceptions
{
    public function show_error($heading, $message, $template = '', $status_code = 500)
    {
        $ci =& get_instance();
        if (!$page = $ci->uri->uri_string()) {
            $page = 'home';
        }
        switch($status_code) {
            case 403: $heading = 'Access Forbidden'; break;
            case 404: $heading = 'Page Not Found'; break;
            case 503: $heading = 'Undergoing Maintenance'; break;
        }
        log_message('error', $status_code . ' ' . $heading . ' --> '. $page);
        if ($status_code == 404) 
        {
            redirect('/mypage');
        }
        return parent::show_error($heading, $message, 'error_general', $status_code);
    }
}

注意:这涵盖了基本问题 - “如何更改 codeigniter 中显示的错误”。对于这个特定的错误,可能有更具体的覆盖。

于 2012-09-27T00:50:15.207 回答