Php Codeigniter | show_404()的记录行为
我使用一个控制器为页面做一些自定义uri路由,它目前工作得很好 这里是控制器的精简版本,它使用PHPTAL作为模板引擎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
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属性造成的。你的回答帮助很大!