CodeIgniter路由问题与正则表达式

时间:2009-12-28 14:48:54

标签: php url codeigniter routes

使用CodeIgniter路由功能时遇到了一些问题。

我使用URI_Language_Identifier extension,我想重新路由所有 对用户/登录的“lang / login”(例如en / login或de / login)的请求我尝试使用如下的路由功能,但它不起作用:

$route['(\w{2})/login'] = "/user/index";

然而,这确实有效:

$route['en/login'] = "/user/index";
$route['de/login'] = "/user/index";

但是工作版本非常糟糕,它会产生冗余代码,如果你想添加新语言,你必须改变很多。

我希望有人像往常一样聪明地回答。提前谢谢。

7 个答案:

答案 0 :(得分:3)

或尝试$ route [':any / login'] =“/ user / index”;

答案 1 :(得分:3)

真正的错误&溶液

嘿 如果有人遇到同样的问题,我发现了真正的错误。

是route.php中的一行

//route example: http://domain.tld/en/controller => http://domain.tld/controller
$route['(\w{2})/(.*)'] = '$2';
$route['(\w{2})'] = $route['default_controller'];

这是扩展名。

您需要在此之前放置所有路线,如下所示:

$route['(\w{2})/signup'] = "user/signup";
//route example: http://domain.tld/en/controller => http://domain.tld/controller
$route['(\w{2})/(.*)'] = '$2';
$route['(\w{2})'] = $route['default_controller'];

无论如何,感谢这篇文章中的所有帮助。你很棒。

答案 2 :(得分:1)

使用RegEx 的所有路由必须放置在scaffolding_triggerdefault_controller的保留路由之后,这很可能是您的问题。

答案 3 :(得分:0)

尝试类似

的内容
$route['.+/login'] = "/user/index";

因为您无论如何都不需要匹配的语言代码。 我想你的(\w{2})表达式的解释有些不对劲,也许你还需要尝试类似的东西:

$route['[a-z]+/login'] = "/user/index";

答案 4 :(得分:0)

这3个都不适合我。

提供更多信息:我在本地服务器上运行它。

我还有一个带有以下代码的.htaccess文件:

AddCharset utf-8 .css .html .xhtml
Options +FollowSymlinks
RewriteEngine on RewriteBase /
RewriteCond $1 !^(index\.php|images|css|robots\.txt)
RewriteRule ^(.*)$ /www/veare/index.php/$1 [L]

我收到404错误。

希望你有更多的想法。感谢。

答案 5 :(得分:0)

以下是处理路由的REGEX部分的代码:

//遍历路径数组寻找通配符

    foreach ($this->routes as $key => $val)
    {                       
        // Convert wild-cards to RegEx
        $key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));

        // Does the RegEx match?
        if (preg_match('#^'.$key.'$#', $uri))
        {           
            // Do we have a back-reference?
            if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)
            {
                $val = preg_replace('#^'.$key.'$#', $val, $uri);
            }

            $this->_set_request(explode('/', $val));        
            return;
        }
    }

我会尝试

$route['\w\w/login'] = "/user/index";

答案 6 :(得分:0)

以下适用于我(假设语言始终为小写):

$route['([a-z]{2})/login'] = '/user/index';

正如Watain所说,因为你不需要匹配的郎。代码,您可以删除'('和')'

$route['[a-z]{2}/login'] = '/user/index';