2012-11-30 82 views
3

我看了一遍又一遍,似乎我无法找到一个答案,我想要的东西,但在这里有云:重定向不允许的字符

我有一个客户是真正的电脑文盲,我要确保出现的任何错误都会在没有干预的情况下处理我现在坚持的一件事是,“你提交的URI不允许使用字符。”错误。

我不想简单地让所有的字符来规避错误。相反,我想要做的只是在发生此错误时重定向到特定的URI。例如:

www.local.com/project/login/ '' '' ---> www.local.com/project/login

我看着用钩子做,但我喜欢在我想执行检查时能够指定自定义URL。

我正在考虑使用对库方法的调用,该方法将从配置中提取字符,然后根据检查是否通过重定向,并将当前URL和URI重定向作为参数。这是做到这一点的方法,还是有一种更简单的方法来管理?

+0

你的问题对我感兴趣,我试着写一个解决方法,看起来像这是CodeIgniter的弱点之一,因为必须有太多的重写来完成这个。我建议你去CodeIgniter GitHub页面并提交这个问题,因为这肯定不是它应该表现的方式,因为这是一个相当普遍的任务。 –

+0

问题是,重定向到错误页面_filter_uri($ str)的函数被调用三次甚至更多,它的主要目的是返回一个干净的URL,所以如果你应用一些逻辑而不是重定向,你会碰巧让你的代码运行3次或更多。我会更深入地研究这个问题,希望我能找到解决方案。 –

+0

感谢队友。我已经准备好上课了,它只是一个如何最好地实施它的问题。它现在最后一天左右让我感到困惑。 :S – thatonefreeman

回答

1

我已阅读以上所有评论 - 但我认为你错过了简单的方法来做到这一点。

只是重载_filter_uri()功能,做你想做的:

(将该文件放在应用程序/核心/ MY_URI.php)

// Normally this is not fully uppercase - but for some reason the URI filename is 
Class MY_URI extends CI_URI 
{ 


/** 
* Filter segments for malicious characters 
* 
* @access private 
* @param string 
* @return string 
*/ 
function _filter_uri($str) 
{ 
    if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE) 
    { 
     if (! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str)) 
     { 
      // DO SOMETHING HERE LIKE REDIRECT OR CHANGE THE URL 
     } 
    } 

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

    return str_replace($bad, $good, $str); 
} 
+0

感谢您的建议。唯一的问题是,我将如何能够从控制器指定我的重定向URI?我希望能够在需要时定义自定义URI。 – thatonefreeman

+1

当您传递错误的字符时,您的请求甚至无法到达控制器。您可以使用路线图并修改上面的代码以重写为映射的网址。 – Broncha

+0

只是重定向到your_controller/handle_error什么的。里面的handle_error - 做任何你想要的控制器的唯一错误处理。 – Laurence

0

这是解决方案,我用我的项目:

文件:应用/核心/ MY_URI.php

class MY_URI extends CI_URI { 

    /** 
    * Filter URI 
    * 
    * Filters segments for malicious characters. 
    * 
    * @param string $str 
    * @return void 
    */ 
    public function filter_uri(&$str) 
    { 
     if (! empty($str) && ! empty($this->_permitted_uri_chars) && ! preg_match('/^['.$this->_permitted_uri_chars.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $str)) 
     { 
      return preg_replace('~[^a-zA-Z 0-9%.:_\-,()]+~', '', $str); 
     } 
    } 
}