【问题标题】:CodeIgniter Route Problem with Regex正则表达式的 CodeIgniter 路由问题
【发布时间】:2010-12-30 12:01:09
【问题描述】:

我在使用 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";

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

我希望有人像往常一样有一个聪明的答案。提前致谢。

【问题讨论】:

    标签: php url codeigniter routes


    【解决方案1】:

    或者试试 $route[':any/login'] = "/user/index";

    【讨论】:

    • 这似乎工作了。我不知道为什么,但是正则表达式根本不起作用。无论如何,谢谢。
    【解决方案2】:

    真正的错误和解决方案

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

    是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'];

    无论如何,感谢您在这篇文章中提供的所有帮助。你太棒了。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        试试类似的东西

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

        因为无论如何您都不需要匹配的语言代码。 我猜您的 (\w{2}) 表达式的解释有问题,也许您还必须尝试以下操作:

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

        【讨论】:

          【解决方案5】:

          这三个都不适合我。

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

          我还有一个带有以下代码的 .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 错误。

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

          【讨论】:

            【解决方案6】:

            这里是处理路由的 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";
            

            【讨论】:

            • 它似乎也不起作用。您需要我提供更多信息吗?如果有任何帮助,请告诉我如何让帮助我变得更容易。谢谢
            • 我认为问题在于,CI 不喜欢我使用正则表达式和普通名称。所以我也需要在正则表达式中告诉“登录”。可悲的是,当谈到正则表达式时,我完全是愚蠢的,那我该怎么做呢?
            【解决方案7】:

            以下对我有用(前提是语言总是小写):

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

            正如Watain 提到的,因为您不需要匹配的语言。代码,你可以去掉'('和')'

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-04-14
              • 2012-09-23
              • 1970-01-01
              • 2012-06-28
              • 2013-05-07
              • 2012-08-08
              • 1970-01-01
              相关资源
              最近更新 更多