Дополнительный сегмент URI перед контроллером Codeigniter - PullRequest
2 голосов
/ 26 февраля 2012

Я делаю этот небольшой проект в Codeigniter, и мне нужно иметь один дополнительный сегмент перед контроллером.
URL Codeigniter по умолчанию:

base_url/controller/function/parameter1/../parametern  

Что мне нужно:

base_url/something/controller/function/parameter1/../parametern 

Где «что-то» - это имя, которое создает пользователь, поэтому я не могу создать подпапку в папке контроллеров, как предлагается в других темах, потому что она динамическая, и каждый пользователь выбирает то, что ему нравится.

По сути, мне нужно, чтобы он игнорировал этот сегмент (я бы перехватил этот сегмент в ловушке, расширил бы CI_controller или что-то в этом роде и проверил бы его), например, если я напишу base_url / stackoverflow-камни / дом / функция , base_url / asd-что угодно / дом / функция Codeigniter будет выглядеть так: base_url / home / function

У меня также естьПосмотрел Передача переменных перед сегментом URI контроллера в вопросе CodeIgniter , он почти такой же, как у меня, но предложенный ответ не сработал.
Я использовал $route['(:any)/(:any)'] = '$2';, который работает, если URL-адрес base_url / что угодно/ home, но если URL-адрес base_url / любой другой / home / function или base_url / любой другой / home / function / param1 /../ paramn, то это не так, для обхода этого нужно написать:

$route['(:any)/(:any)'] = '$2';  
$route['(:any)/(:any)/(:any)'] = '$2/$3';  
...  
$route['(:any)/../(:any)'] = '$2/../$n'  

, что легко, но кажется немного неубедительным, и это будет работать, только если у меня есть от 2 до n сегментов в URL.Я также попытался смешать его с регулярными выражениями, такими как:

$route['(:any)/(.*)'] = '$2'

Но он работает так же, как и предыдущий, (. *) - это только один сегмент, но не весь URL-адрес ... Есть ли какой-то способпросто написать
$route['(:any)/rest of the url'] = 'rest of the url';?
Я также пытался использовать .htaccess:

RewriteRule ([^/]*)/(.*) inedx.php?/$2  

или

RewriteRule (.*)/(.*) index.php?/$2

Но это не сработало, потому что $ 2 ссылается наПервая часть, например, если я пишу:
base_url / one / two, он переписывает его в base_url / index.php? / one.Но если я использую:

RewriteRule (.*)/(.*) index.php?/$1/test/$2

, он ссылается как следует, например, base_url / one / two => base_url / index.php? / One / test / two, поэтому $ 1 = один и $ 2 = два, как и должно быть.

Довольно длинный вопрос, но я надеюсь, что кто-то может помочь, спасибо!

1 Ответ

0 голосов
/ 26 февраля 2012

посмотрите, работает ли это:

$route['base_url/controller/(:any)'] = 'base_url/$1'
...