Проблема с маршрутом CodeIgniter с регулярным выражением


У меня небольшая проблема с использованием функции маршрута CodeIgniter.

я использую URI_Language_Identifier расширение и я хочу, чтобы перенаправить все запросы для "Lang" / "вход" (например, En/login или де/логин) пользователя/входа в систему я попытался использовать маршруты функцию следующим образом, но он не работает:

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

Это, однако, работает:

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

Но рабочая версия довольно плоха, она будет создавать избыточный код, и вам придется многое изменить, если вы хотите добавить новый язык.

Я надеюсь, что у кого-то, как обычно, есть разумный ответ. Заранее спасибо.

Author: Lukas Oppermann, 2009-12-28

7 answers

Или попробуйте $route[':любой/логин']= "/пользователь/индекс";

 3
Author: P.M, 2009-12-28 15:00:41

Реальная ошибка и решение

Эй, просто если у кого-то такая же проблема, я нашел настоящую ошибку.

Это линия в маршруте.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
Author: Lukas Oppermann, 2010-01-01 10:53:52

Любые маршруты, использующие регулярное выражение , должны располагаться после зарезервированных маршрутов scaffolding_trigger и default_controller, скорее всего, это ваша проблема.

 1
Author: Zack, 2009-12-28 16:55:06

Попробуйте что-то вроде

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

Так как вам все равно не нужен соответствующий код языка. Я предполагаю, что что-то не так с интерпретацией вашего выражения (\w{2}), возможно, вам также придется попробовать что-то вроде:

$route['[a-z]+/login'] = "/user/index";
 0
Author: watain, 2009-12-28 14:52:58

Все 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.

Надеюсь, у вас есть еще какие-то идеи. Спасибо.

 0
Author: Lukas Oppermann, 2009-12-28 15:37:47

Вот код, который обрабатывает РЕГУЛЯРНУЮ часть маршрутизации:

//Пройдите по массиву маршрутов в поисках подстановочных знаков

    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";
 0
Author: Xeoncross, 2009-12-28 15:44:00

Для меня работает следующее (при условии, что язык всегда строчный):

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

Как упоминал Ватейн, поскольку вам не нужен соответствующий язык. код, вы можете удалить '(' и ')'

$route['[a-z]{2}/login'] = '/user/index';
 0
Author: Konel Sum, 2009-12-28 17:28:53