Php Codeigniter | show_404()的记录行为

Php Codeigniter | show_404()的记录行为,php,codeigniter,Php,Codeigniter,我使用一个控制器为页面做一些自定义uri路由,它目前工作得很好 这里是控制器的精简版本,它使用PHPTAL作为模板引擎 public function index() { $this->tal->display('index'); } public function view($url) { $this->loadView($url); } private function loadView($url) { if (file_e

我使用一个控制器为页面做一些自定义uri路由,它目前工作得很好

这里是控制器的精简版本,它使用PHPTAL作为模板引擎

public function index()
{
    $this->tal->display('index');
}

public function view($url)
{       
    $this->loadView($url);
}   

private function loadView($url) 
{

   if (file_exists(ROOTPATH . 'webroot/' . $url . '/index.html')) 
   {
       $this->tal->display($url . '/index');
   } 
   else 
   {  
       show_404();
   }
}
问题 我最近注意到,每次访问页面控制器时,我的日志中都会出现以下错误:

错误-2013-02-06 10:58:23-->找不到404页-->

我发现这很奇怪,因为页面显示的和预期的一样,肯定没有404标题,网络面板也没有404状态

我最后把范围缩小到
loadView()
方法中调用的
show_404()
helper方法。删除该行将完全阻止错误出现在日志文件中

此§show_404()§仅在找不到视图文件时执行,在这种情况下,它应显示404错误页面,它会显示。但是,无论是否调用
loadView()
方法,每次调用页面控制器时都会执行该方法的日志部分

例子
我在浏览器中访问
index()
视图,一切正常,加载了正确的视图文件,没有错误。但是,
loadView()
方法会记录404错误消息。
loadView()
方法甚至没有从
index()
方法调用,但是日志文件中存在它的输出似乎表明它正在执行。

show\u 404的默认行为是。还有第二个可选参数用于禁用它,因此如果您只想显示404页面而不记录它,请按如下方式调用它:

show_404(“”,false);
第一个参数是附加在日志中
-->
之后的字符串,因此您也可以将其保留为空

至于调用
\u loadView
函数的原因:
如果您使用的URL中没有
index.php
(空
$config['index\u page']
),那么Web服务器找不到的每个静态资产(图像、js、css等)(取决于具体的重写规则)都将传递到php脚本,并可能在那里生成404错误。

谢谢您的回答!我正在删除index.php。但是我仍然不明白为什么在没有引用的索引视图中调用
\u loadView()
(或任何其他函数)?另外,如果调用了_loadView,为什么show_404只记录错误而不重定向到errors/error_404.html页面?
show_404()
默认情况下不会重定向请求,只显示错误页面。只有当“原始”请求进入该路径时,您才会看到这一点。尝试检查firebug中的网络面板或chrome webtools中的网络面板,查看anyting是否在那里得到404响应。您可以尝试在
show_404
旁边插入回溯,并将其记录在某个位置,以查看呼叫来自何处。我的网络面板中没有404响应。如果我从代码中删除show_404(),则不会记录任何404错误。如果我在show_404()旁边插入回溯,它永远不会执行,我插入的任何其他代码也不会执行(应该如此)。也就是说,如果我添加了一个
echo“error”;模具()它被完全忽略,页面加载模板/视图(正如它应该做的那样)。但是如果我调用
show_404()
日志消息(“错误”,“这是一个错误”)log\u message()
函数中,直到一些有用的东西出现。我不确定它发生的原因/方式以及它与控制器中的show\u 404()调用的关系。但这似乎是由于我拼错了favicon.icn链接标签的href属性造成的。你的回答帮助很大!