Проблема с маршрутом CodeIgniter с регулярным выражением
У меня небольшая проблема с использованием функции маршрута CodeIgniter.
я использую URI_Language_Identifier расширение и я хочу, чтобы перенаправить все запросы для "Lang" / "вход" (например, En/login или де/логин) пользователя/входа в систему я попытался использовать маршруты функцию следующим образом, но он не работает:
$route['(\w{2})/login'] = "/user/index";
Это, однако, работает:
$route['en/login'] = "/user/index";
$route['de/login'] = "/user/index";
Но рабочая версия довольно плоха, она будет создавать избыточный код, и вам придется многое изменить, если вы хотите добавить новый язык.
Я надеюсь, что у кого-то, как обычно, есть разумный ответ. Заранее спасибо.
7 answers
Или попробуйте $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'];
В любом случае спасибо за всю помощь в этом посте. Ты великолепен.
Любые маршруты, использующие регулярное выражение , должны располагаться после зарезервированных маршрутов scaffolding_trigger
и default_controller
, скорее всего, это ваша проблема.
Попробуйте что-то вроде
$route['.+/login'] = "/user/index";
Так как вам все равно не нужен соответствующий код языка.
Я предполагаю, что что-то не так с интерпретацией вашего выражения (\w{2})
, возможно, вам также придется попробовать что-то вроде:
$route['[a-z]+/login'] = "/user/index";
Все 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.
Надеюсь, у вас есть еще какие-то идеи. Спасибо.
Вот код, который обрабатывает РЕГУЛЯРНУЮ часть маршрутизации:
//Пройдите по массиву маршрутов в поисках подстановочных знаков
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';
Как упоминал Ватейн, поскольку вам не нужен соответствующий язык. код, вы можете удалить '(' и ')'
$route['[a-z]{2}/login'] = '/user/index';