Router & URI 的中文字支援處理
因為 Codeigniter 預設的 Filter 能處理字串保持網址安全。不過我又希望能夠傳入中文字串。
所以用了下面的處理方法。
不知道這樣是否安全……
(台灣的中文論壇討論不怎麼熱烈,上中國的開發者社區……)
MY_Router.php
<?php if( ! defined('BASEPATH') ) exit('No direct script access allowed');
/*
* Codeigniter Router Extend
* @package CI-Dev
* @author 蒼時弦や
*/
class MY_Router extends CI_Router
{
static private $pages;
function __construct()
{
parent::CI_Router();
}
function _validate_request($segments)
{
// Does the requested controller exist in the root folder?
if (file_exists(APPPATH.'controllers/'.$segments.EXT))
{
return $segments;
}
// Is the controller in a sub-folder?
if (is_dir(APPPATH.'controllers/'.$segments))
{
// Set the directory and remove it from the segment array
$this->set_directory($segments);
$segments = array_slice($segments, 1);
if (count($segments) > 0)
{
// Does the requested controller exist in the sub-folder?
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments.EXT))
{
show_404($this->fetch_directory().$segments);
}
}
else
{
$this->set_class($this->default_controller);
$this->set_method('index');
// Does the default controller exist in the sub-folder?
if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
{
$this->directory = '';
return array();
}
}
return $segments;
}
// Can't find the requested controller...
//Routing to Manager
if($segments == 'index')
return array('manager', 'index', array_slice($segments, 1));
else
return array('manager', 'index', $segments);
}
}
其實也就只是在找不到時轉到 manager 這個 Controller 去控管。
(參考之前的貼子改良的)
MY_URI.php
<?php if( ! defined('BASEPATH') ) exit('No direct script access allowed');
/*
* Codeigniter URI Extend
* @package CI-Dev
* @author 蒼時弦や
*/
class MY_URI extends CI_URI
{
function __construct()
{
parent::CI_URI();
}
/**
*
* Filter URI (Chinese Support)
*
* @access private
* @prama string
* @return string
*/
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))
{
//show_error('The URI you submitted has disallowed characters.', 400);
//Urlencode Fix
$str = urlencode($str);
return array(1, $str);
}
}
// Convert programatic characters to entities
$bad = array('$', '(', ')', '%28', '%29');
$good = array('$', '(', ')', '(', ')');
return str_replace($bad, $good, $str);
}
/**
* Explode the URI Segments. The individual segments will
* be stored in the $this->segments array.
* Fix for Chinese (change to prama)
*
* @access private
* @return void
*/
function _explode_segments()
{
foreach(explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $key => $val)
{
// Filter segments for security
$val = $this->_filter_uri($val);
if ($val != '' && !is_array($val))
{
$this->segments[] = trim($val);
}else{
if($key >= 2)
$this->segments[] = $val;
else{
$this->segments[] = 'index';
$this->segments[] = $val;
}
}
}
}
}
因為 URI 比 Router 被 Load, 所以不能在 Load 上另外處理。
(在Router做_filter_uri之前會先做一次確保網址安全。)
進行分段的時候檢查是否被urlencode過,如果是則會強制推到傳入的值。
(避開Controller和Method)
不過 deurlencode 之後的事就不知道是不是安全了……
(雖然只是要弄類似 slug 那樣查詢,不會去 deurlencode ...) 因為 Codeigniter 預設的 Filter 能處理字串保持網址安全。
不過我又希望能夠傳入中文字串。
所以用了下面 ...
elct9620 发表于 2011-1-18 22:19 http://codeigniter.org.cn/forums/images/common/back.gif
该留言已被Saturn删除,有意见请到指定版面投诉,感谢支持。 再來回答下你的問題吧
我感覺你傳中文的controller/action沒什麽意義。因為各個瀏覽器不同,有些瀏覽器你傳中文轉碼會丟失的,例如IE,firefox下你傳編碼過的和沒編碼的是一樣的。我這個意思就是你傳中文在有些瀏覽器下容易出錯。
再就是搜索引擎,一般會把編碼后的解碼來收錄,就是還是收錄你的中文字體。 再來回答下你的問題吧
我感覺你傳中文的controller/action沒什麽意義。因為各個瀏覽器不同,有些瀏覽器你 ...
bluelomo 发表于 2011-1-19 16:34 http://www.codeigniter.org.cn/forums/images/common/back.gif
我就是為了讓他收錄中文字才這樣處理的……
因為我的 Project 得自動產生數個頁面。
不過這時碰上頁面設定為中文時,我擔心沒辦法顯示。
Google自動音譯又不知道怎麼弄的,只好這樣處理。
不過我比較好奇的是做過 urlencode 處理後的字串是否安全,和各瀏覽器是否正常支援。 不支持就自动用上urlencode的。我试过。 何必搞那么麻烦呢 你直接让Apache2支持中文URL就可以了么自己搜索下如何配置。 回复 6# litaobbs
不是所有人都会弄你哪个东东,支持楼主~~
页:
[1]