exmple:这个带有函数page
,
www.example.com/page
除非我们有名为page
的控制器/类并设置$route['page'] = 'page';
,否则它将加载控制器。但是如果我们不设置$route
,它仍然会加载default_controller。
是真的,controller
必须始终有$route['']
吗?是否可以在没有设置page
的情况下加载控制器$route['']
,即使没有相同名称的默认控制器功能?
修改
我访问
www.mysite.com/index.php/user
我的user
控制器有index
功能,但我的路径文件只包含:
$route['default_controller'] = 'page';
$route['(:any)'] = 'page/$1';
$route['product'] = 'product';
//$route['user'] = 'user';
$route['404_override'] = '';
返回404
,仅在我取消注释时才有效:$route['user'] = 'user';
为什么?
感谢。
答案 0 :(得分:2)
不,那不是真的。 CodeIgniter,默认情况下为directly maps URI segments:
example.com/index.php/controller/method/param/param/...
或者如果您有.htaccess /类似的解决方案来删除index.php:
example.com/controller/method/param/param/...
如果您希望使用不直接映射到此约定的URL,则使用
修改:您的路线存在冲突。 CodeIgniter将从上到下按顺序查看每条路线,如果找到匹配的路线,它将停止查找并处理该路线。因为你有一个(:any)
catch-all路线,它会匹配任何(就像它说的那样)。
经验法则是首先放置您最具体的路线,然后在以后获得更多通用和全部捕捉。您的(:any)
路线应该是列表中的最后一条路线。默认控制器和404覆盖应保持优先。
$route['default_controller'] = 'page';
$route['404_override'] = '';
$route['product'] = 'product';
$route['user'] = 'user';
$route['(:any)'] = 'page/$1';
您需要添加product
和user
路由,因为您已定义(:any)
路由。如果您想避免为每个现有控制器编写路由规则,但仍然利用全能控制器,请考虑使用404_override
控制器/方法。您可以进行验证以检查URI是否在那里有效。如果没有,请确保抛出404错误(您可以使用show_404()
),因为任何不存在的URL都将被路由到那里。