我在CodeIgniter的路由器中写过这个。
$route['companyname'] = "/profile/1";
这工作正常但是当我在URL中输入“CompanyName”时它就不起作用了。这是因为大写字符。
我想让这个路由不敏感。请建议最佳方式。
答案 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.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())