【问题标题】:Logging behavior of Codeigniter | show_404()Codeigniter 的日志记录行为 |显示_404()
【发布时间】:2016-04-21 20:20:55
【问题描述】:

我使用控制器为页面做一些自定义 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();
   }
}

问题

我最近注意到每次访问页面控制器时,我的日志中都会出现以下错误:

ERROR - 2013-02-06 10:58:23 --> 404 Page Not Found -->

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

我最终将其缩小到在 loadView() 方法中调用的 show_404() 辅助方法。删除该行会阻止错误完全出现在日志文件中。

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

示例

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

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    show_404 的默认行为是insert a log entry when its called。还有第二个可选参数可以禁用它,所以如果你只想显示 404 页面而不记录它,可以这样调用它:

    show_404('', false);
    

    第一个参数是日志中--> 后面的字符串,所以你也可以留空。

    至于为什么_loadView函数可能会被调用:

    如果您使用的网址中没有 index.php(空的 $config['index_page']),那么网络服务器服务器找不到的每个静态资产(图像、js、css 等)(取决于具体的重写规则)将被传递给 php 脚本,并可能在那里生成 404 错误。

    【讨论】:

    • 感谢您的回答!我正在删除 index.php。但我仍然不明白为什么_loadView()(或任何其他函数)会在没有引用它的索引视图中被调用?此外,如果 _loadView 被调用,为什么 show_404 只记录错误而不重定向到 errors/error_404.html 页面?
    • show_404() 默认不会重定向请求,只显示错误页面。如果“原始”请求进入该路线,您只会看到这一点。尝试检查 firebug 中的 net 面板或 chrome webtools 中的网络面板,看看是否有任何 404 响应。您可以尝试在 show_404 旁边插入回溯,并将其也记录在某处,以查看呼叫来自何处。
    • 我的网络面板中没有 404 响应。如果我从代码中删除 show_404(),则不会记录任何 404 错误。如果我在 show_404() 旁边插入回溯,它永远不会被执行,我插入的任何其他代码也不会被执行(应该如此)。 IE。 - 如果我添加 echo 'error';die(); 它会被完全忽略,并且页面会加载模板/视图(应该这样做)。但是,如果我调用 show_404();log_message('error', 'This is an error');,它们似乎已被执行,尽管它们的消息未被调用,因为它们的消息已记录到日志文件中。
    • 好吧,不知何故调用了日志记录。从"select” Isn’t Broken 开始,我会尝试将回溯/调试日志内容移到核心log_message() 函数中,直到出现有用的东西。
    • 不确定我理解它为什么/如何发生以及它与我的控制器中的 show_404() 调用的关系。但这似乎是由于我对 favicon.icn 链接标签的 href 属性拼写错误造成的。您的回答很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多