codeigniter函数在没有被调用的情况下运行,很奇怪

时间:2016-01-05 18:06:29

标签: codeigniter

我有一个名为Traffic的库,我需要记录用户访问时使用它。我在autoload配置文件中自动加载它,但只在需要时调用方法函数。

class Traffic {

    function monitor()
    {
        $CI=& get_instance();

        $ip = $CI->input->ip_address();

        $input = array( 'ip' => $ip);
        $CI->db->insert('traffic', $input);
    }
}

我称之为

class Post extends CI_Controller {
    function __construct()
    {
        parent::__construct();      
    }

    public function index()
    {
        $this->traffic->monitor();
        $this->load->view('post_view');
    }

}

这是post_view.php

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>

<img src="http://sample.com/photo/img_2133.jpg" />
</body>
</html>

问题是,如果无法找到页面中的图像(已删除),则插入将发生两次。看起来像流量类的404错误方法monitor()。即使我没有要求它这样做。

因此,如果帖子视图页面有10个图像,并且所有图像都已删除或不存在,那么我的流量表将有11个新记录。 1表示我在控制器中调用的内容,10表示404错误。

如何停止404错误自动调用monitor方法。 404错误到底怎么可以访问我的库?

更新:

我的htaccess

#this code redirect site to non www address then remove index.php from url
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

我的routes.php

$route['default_controller'] = "home";
$route['404_override'] = 'my404';

$route['(login|post)'] = "$1";
$route['(login|post)/(:any)'] = "$1/$2";
$route['(:any)'] = "post/index/$1";

1 个答案:

答案 0 :(得分:1)

问题出在路由范围内。我们来看一下图片网址photos/image.jpg的例子。

首先,根据 .htaccess 中的规则,URL(与现有文件不匹配)更改为index.php/photos/image.jpg

其次,根据规则(:any),网址更改为post/index/photos/image.jpg,这是指 Post 控制器的索引方法。因此,每个删除的图像都会导致插入traffic表。

解决方案是过滤 photos 目录中的请求,并使服务器为已停止的图像抛出真正的404 HTTP错误。例如,您可以通过将照片目录添加到 .htaccess 规则来实现此目的:

RewriteCond $1 !^(index\.php|resources|photos|robots\.txt)