codeigniter中的自定义URL

时间:2014-10-06 19:30:37

标签: php codeigniter url-rewriting

我有一个名为' project'用索引方法

我想传递project_id 它适用于此网址:  网址:http://example.com/project/index/project_id

我要做的是为每个项目设置网址 http://example.com/project_id 例如: http://example.com/rickyboby

我试过这段代码 $route['(:any)'] = "project/index/$1"; 它工作,我可以从URL www.example.com/project_id访问project_id,但问题是我现在有其他控制器不工作,例如我有欢迎控制器,网址:www.example.com/welcome/正在路由我项目页面,我该如何解决?

2 个答案:

答案 0 :(得分:2)

您需要将“any”规则之前的所有控制器列入白名单,因为它们按顺序排列(因此在您的示例中,/welcome会将您带到project/index/welcome)。例如:

$route['welcome'] = "welcome";
$route['somethingElse'] = "someOtherUrl";
$route['(:any)'] = "project/index/$1";

你也可以尝试用正则表达式来思考一种聪明的方法,但我认为你最好使用白名单。


这是一个基本的编程概念,可能不属于这里,但你总是可以这样做:

$controllers = array('welcome', 'otherController', 'etc');
foreach($controllers as $c) {
    $route[$c] = $c; // make all URLs from the list go to their same-named controllers
}
$route['(:any)'] = "project/index/$1"; // handle the other URLs

还有一件事 - 不要忘记阻止用户提供与现有控制器名称匹配的项目名称(例如welcome),因为他们的项目将无法访问!还有另一个原因让控制器列在某个地方...

答案 1 :(得分:0)

将“欢迎”路由规则放在“项目”路由规则之前。这样系统将匹配欢迎,不会去寻找下一个规则。或者,您可以使用(:num)而不是(:any),这样它只匹配数字(如果您的项目ID是数字)。