如何将每个uri调用重定向到一个控制器,除了一些静态调用?

时间:2010-05-14 16:18:39

标签: php codeigniter codeigniter-routing

我正在使用codeigniter并希望让我的门户网站更加友好。 我有一个控制器(文章)处理我的门户网站上的每篇文章。 URL如下所示:

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

我正在使用mod重写模块来隐藏我的index.php和codeigniter路由以隐藏处理每个调用的控制器操作。

我也想隐藏文章,但如果我隐藏它,每次调用都会转到文章控制器,这不是我想要的,因为我希望我的网址看起来像这样:

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

我已尝试使用routes.php中的regexp路由规则,但我发现无法使其正确。

4 个答案:

答案 0 :(得分:3)

使用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部分保留在你的网址中并按照以下方式执行:

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

但您仍需要在控制器中创建category方法。

答案 1 :(得分:3)

我几天前非常广泛地回答了这个问题:

How to get an array of all controllers in a Codeigniter project?

答案 2 :(得分:2)

OK!问题解决了!

我在以下网站上找到了我的问题的解决方案: 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";

这一行将每个非控制器请求返回给我的文章控制器,所以我有我想要的网址:)

答案 3 :(得分:0)

RewriteCond %{REQUEST_URI} !^articles(?:/|$)
RewriteCond %{REQUEST_URI} !^static1(?:/|$)
RewriteCond %{REQUEST_URI} !^static2(?:/|$)
...
RewriteRule ^/(.*) /articles/$1 [QSA,NE]