CodeIgniter中的大小写不敏感路由

时间:2011-11-17 03:02:51

标签: codeigniter router

我在CodeIgniter的路由器中写过这个。

$route['companyname'] = "/profile/1";

这工作正常但是当我在URL中输入“CompanyName”时它就不起作用了。这是因为大写字符。

我想让这个路由不敏感。请建议最佳方式。

8 个答案:

答案 0 :(得分:15)

只需添加表达“(?i)
这里的例子:
$route['(?i)companyname'] = "/profile/1";

答案 1 :(得分:3)

如果你想要对所有路由不区分大小写的路由,你只需要扩展CI_Router类,然后像这样修改_parse_routes()方法:

public function _parse_routes()
{
    foreach ($this->uri->segments as &$segment)
    {
        $segment = strtolower($segment);
    }

    return parent::_parse_routes();
}

它比编辑CI_URI类本身更清晰。 :)

答案 2 :(得分:1)

使用钩子:

创建application / hooks / LowerUrl.php

class LowerUrl {
    public function run() {
            $_SERVER['REQUEST_URI'] = strtolower($_SERVER['REQUEST_URI']);
    }
}

添加到application / config / hooks.php

$hook['pre_system'] = array(
    'class'    => 'LowerUrl',
    'function' => 'run',
    'filename' => 'LowerUrl.php',
    'filepath' => 'hooks'
);

答案 3 :(得分:0)

嗯,嗯,一个肮脏但直截了当的方式是对核心的Uri级别进行小规模的攻击。打开uri.php中的system/core/文件,滚动到第269行,您可以使用方法_explode_segments()并将其设为小写。不好的方法,但应该有用。

function _explode_segments()
{
    foreach (explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val)
    {
        // Filter segments for security
        $val = trim($this->_filter_uri($val));

        if ($val != '')
        {
                    // $this->segments[] = $val;  // <--- ORIGINAL
            $this->segments[] = strtolower($val);   // <--- CHANGED
        }
    }
}  

考虑一下如果升级安装,这些更改将被覆盖,但无论如何它们都是如此之小。或者,您可能会使用pre_system挂钩,但我认为这将更加困难

此外,在路线中,您不应使用前导或尾部斜杠,因此必须

$route['companyname'] = "profile/1";

答案 4 :(得分:0)

也许您可以在strtolower功能中使用_remap。它不确定是否有效,这只是一个想法;)

答案 5 :(得分:0)

我能想到的最简单的方法是使用mod_rewrite强制执行小写网址(如果你使用的是apache ......)

RewriteMap  lc int:tolower
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule (.*) ${lc:$1} [R=301,L]

来源: http://www.chrisabernethy.com/force-lower-case-urls-with-mod_rewrite/

答案 6 :(得分:0)

使用路由器:

$urix = substr(strtolower($_SERVER['REQUEST_URI']), 1);

$route["(?i)$urix"] = $urix;

所有不区分大小写路由的解决方案..

答案 7 :(得分:0)

IN目录 system / core / uri.php

搜索

  

$这 - &GT; _parse_request_uri()

你会发现2用

替换它们
  

用strtolower($这 - &GT; _parse_request_uri())