簡體   English   中英

正則表達式的CodeIgniter路由問題

[英]CodeIgniter Route Problem with Regex

我在使用CodeIgniter路由功能時遇到了一些問題。

我使用URI_Language_Identifier擴展名,並且我想將對“ lang / login”的所有請求(例如,en / login或de / login)重新路由到用戶/登錄名,我試圖按以下方式使用routes函數,但它不起作用:

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

但這確實起作用:

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

但是工作版本非常糟糕,它將產生冗余代碼,如果要添加新語言,則必須更改很多代碼。

我希望有人像往常一樣有一個明智的答案。 提前致謝。

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

真正的錯誤與解決方案

嘿,即使有人遇到相同的問題,我也發現了真正的錯誤。

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

無論如何,感謝您在這篇文章中提供的所有幫助。 你很棒。

任何使用RegEx的路由都必須放在scaffolding_triggerdefault_controller的保留路由之后,這很可能是您的問題。

嘗試類似

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

因為您仍然不需要匹配的語言代碼。 我想您的(\\w{2})表達式的解釋有問題,也許您還必須嘗試以下方法:

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

這三個都不適合我。

僅提供一些更多信息:我正在本地服務器上運行它。

我也有一個帶以下代碼的.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錯誤。

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

這是處理路由的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";

以下對我有用(提供的語言始終為小寫):

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

正如Watain所述,因為您不需要匹配的lang。 代碼,您可以刪除'('和')'

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM