Как перенаправить все вызовы uri на один контроллер, кроме некоторых статических?

Я использую codeigniter и хочу сделать свой портал более оптимизированным для SEO. У меня есть контроллер (статьи), который обрабатывает каждую статью на моем портале. URL-адрес выглядит следующим образом:

example.com/articles/category-sub-category/article-name

Я использую модуль перезаписи модов, чтобы скрыть свой index.php, и маршрутизацию codeigniter, чтобы скрыть действие контроллера, которое обрабатывает каждый вызов.

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

example.com/category-sub-category/article-name

Я пробовал это с правилами маршрутизации регулярных выражений в route.php, но не нашел способа сделать это правильно.


person therufa    schedule 14.05.2010    source источник
comment
Может быть, это только я, но я понятия не имею, что это за статьи и почему вы хотите это скрыть. И почему вы хотите что-то скрыть   -  person Your Common Sense    schedule 14.05.2010
comment
Я хочу скрыть это, потому что мне нужен очень хороший SEO-адрес для моего сайта. статьи - это имя моего контроллера. Я вызываю его через uri, если я назову его, как в моем первом примере, это не лучший вариант, я думаю, потому что это использовать портал на большем количестве разных языков, я использую разные категории, и я думаю, что я получу лучший рейтинг на каждом языке, если призыв к действию статьи отсутствует. (извините за плохое владение языком)   -  person therufa    schedule 14.05.2010


Ответы (4)


Я довольно подробно ответил на этот вопрос несколько дней назад:

Как получить массив всех контроллеров в проекте Codeigniter?

person Phil Sturgeon    schedule 16.05.2010

Используя функцию маршрутизации CI, вам нужно будет установить маршрут для каждой категории, например.

$route['category_one/:any'] = 'articles/category/category_one';
$route['category_two/:any'] = 'articles/category/category_two';
//.. and on and on until you've routed them all

Вам нужно было бы иметь метод category в вашем контроллере Articles, иначе вам также пришлось бы создавать метод для каждой категории, что вышло бы из-под контроля.

По крайней мере, с CodeIgniter вам лучше оставить часть articles в своем URL-адресе и сделать это следующим образом:

$route['articles/(:any)'] = 'articles/category/$1';

Однако вам все равно нужно создать метод category в вашем контроллере.

person bschaeffer    schedule 14.05.2010
comment
Хорошо, вот как я это делаю прямо сейчас, но мне нужен нестатический способ сделать это. Я почти уверен, что есть другой способ с регулярным выражением или около того (единственная проблема, которую я не знаю, как это сделать). Я пробовал со следующим синтаксисом: $route['#[^articles]/:any#'] = $1/$2; но это не сработает - person therufa; 14.05.2010
comment
Почему вы используете $route['#[^articles]/:any#'] = $1/$2; Вам не нужен запуск/остановка регулярного выражения, так что это будет $route['articles/(:any)'] = $1/$2; () означает, что вы можете использовать $1, но вы сопоставляете только одну вещь, поэтому $2 не работает. - person Phil Sturgeon; 17.05.2010

в порядке! проблема решена!

Я нашел решение своей проблемы на следующем сайте: http://bizwidgets.biz/web-design/codeigniter-routes-trick-removing-controller-names-from-the-uri-to-keep-urls-short/

$route['^(?!account|about|showcase|etc).*'] = "articles/read/$0";

Эта строка возвращает все запросы, не относящиеся к контроллеру, к моему контроллеру статей, поэтому у меня есть URL-адреса, которые я хотел иметь :)

person therufa    schedule 14.05.2010
comment
Поздравляю! Но просто чтобы вы знали, чтобы не быть придурком здесь, но каждый запрос технически является запросом контроллера. Вы просто перенаправляете все, что не запрашивает учетную запись, информацию, витрину и т. д., на контроллер статей. - person bschaeffer; 15.05.2010

person    schedule
comment
Это хороший способ, но не кодовый способ решения проблемы. Это почти то же самое, так что спасибо! - person therufa; 15.05.2010