|
本帖最后由 yuzhigang5460 于 2011-8-25 16:48 编辑
CI默认的404页面在application/errors/show_404.php下,当访问控制器类或方法不存在时将会路由到此处,但我现在有一个简单的需求,想在这个404页面上加一个返回到home主页的链接,那么该怎么办呢?
你可能首先想到的是加一句话即可:
PHP复制代码 <?php echo anchor('', '回到首页');?> 复制代码
那么这样做行不行呢,比如我们访问http://www.test.com/index.php/blog/view,现在我们分两种情况来讨论:
1. 你的网站根本不存在blog控制器,即不存在这个类;
2. 你的网站存在这个blog控制器,但不在view这个方法;
当是第二种情况时,使用PHP复制代码 <?php echo anchor('', '回到首页');?> 复制代码 没有问题;
但是第一种情况时,这个方法就不行了。
实际上第一种情况在用户访问网站时也存在的,当用户误入404页面后返回到主页的需求也是存在的。但为什么第一种情况时访问CI资源不行呢?我们可以看源代码:
PHP复制代码
$RTR =& load_class('Router', 'core');
$RTR->_set_routing();
...........
function _validate_request($segments)
.........
$CI = new $class();
复制代码
可以看到在CI对象还没存在的时候,我们就有误入404的可能,大部分CI的资源,如helper,library等都是在new CI的时候创建的,所以此时根本无法使用这些helper来返回主页。
那如果使用routers的自定义404页面呢?PHP复制代码 $route['404_override'] = 'error/myerror'; 复制代码
然后自己写一个控制器,加上方法。【更新:此时是可以使用CI对象的,被重新路由到自定义404页面,如果自定义页面存在的话,否则还是会被带到系统默认的show_404页面,依旧使用不了CI对象】
那么,使用htaccess的ErrorDocument呢,原则上CI对进入了index.php的一切url地址通吃,不存在errorDocument,所以无法处理在CI内出现的错误控制器情况。
【以上理解有误的地方已经被我修改了】
{:soso__433253175740619224_4:} |
评分
-
查看全部评分
|